2014-07-07 50 views
4

下面是我試圖在JFrame上繪製一些圖形的代碼。我試圖設置給出錯誤的JFrame的佈局。但是,如果我沒有設置佈局代碼工作正常,但沒有所需的方式。我找不出什麼問題。請幫忙! =)在JFrame中看不到單個項目?

import java.awt.*; 
import javax.swing.*; 

class GuiForJFrame extends JFrame { 
    private FlowLayout layout; 
    private Container container; 

    public GuiForJFrame() { 
     super("Drawing Graphics"); 

     // Setting the Layout 
     layout = new FlowLayout(FlowLayout.LEFT); 
     container = getContentPane(); 
     setLayout(layout); 
    } 
} 

class GuiForDrawingGraphics extends JPanel { 
    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     this.setBackground(Color.WHITE); 

     g.setColor(Color.RED); 
     g.fillRect(25, 25, 150, 50); 

     g.setColor(new Color(156, 32, 111)); 
     g.fillRect(25, 80, 150, 50); 

     g.setColor(Color.BLACK); 
     g.drawString("Drawing Graphics in JAVA", 25, 150); 

    } 
} 

public class Application { 
    public static void main(String[] args) { 
     // Creating the JFrame object 
     GuiForJFrame jFrame = new GuiForJFrame(); 
     jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     // Adding Graphics to JFrame 
     GuiForDrawingGraphics graphics = new GuiForDrawingGraphics(); 
     jFrame.add(graphics); 
     jFrame.setSize(500, 200); 
     jFrame.setVisible(true); 
    } 
} 
+0

您正在使用的FlowLayout,然後添加具有的[0,0]較好大小一個JPanel,因此它是有道理的,你會看到什麼。爲什麼使用FlowLayout而不是默認的BorderLayout,在這裏會更有意義? –

回答

2

正如另一個答案中所述,自定義繪製的面板沒有固有尺寸。它應該返回適合內容的首選大小。那麼我們只需要在pack()之後加框。

enter image description here

import java.awt.*; 
import javax.swing.*; 

class GuiForJFrame extends JFrame { 
    private FlowLayout layout; 
    private Container container; 

    public GuiForJFrame() { 
     super("Drawing Graphics"); 

     // Setting the Layout 
     layout = new FlowLayout(FlowLayout.LEFT); 
     container = getContentPane(); 
     setLayout(layout); 
    } 

    public static void main(String[] args) { 
     // Creating the JFrame object 
     GuiForJFrame jFrame = new GuiForJFrame(); 
     jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     // Adding Graphics to JFrame 
     GuiForDrawingGraphics graphics = new GuiForDrawingGraphics(); 
     jFrame.add(graphics); 
     //jFrame.setSize(500, 200); 
     jFrame.pack(); 
     jFrame.setVisible(true); 
    } 
} 

class GuiForDrawingGraphics extends JPanel { 
    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     this.setBackground(Color.WHITE); 

     g.setColor(Color.RED); 
     g.fillRect(25, 25, 150, 50); 

     g.setColor(new Color(156, 32, 111)); 
     g.fillRect(25, 80, 150, 50); 

     g.setColor(Color.BLACK); 
     g.drawString("Drawing Graphics in JAVA", 25, 150); 

    } 

    public Dimension getPreferredSize() { 
     return new Dimension(300,200); 
    } 
} 
1

jFrame.pack();jFrame.validate();。這會將所有子組件(即jFrame內部的組件)以及jFrame本身設置爲適當的大小,並確保它們甚至可以顯示,並且不會拋出任何錯誤。

如果你不這樣做,沒有什麼會(也不應該)顯示出來。

所以,你對Application類代碼應該是這樣的:

public class Application { 
    public static void main(String[] args) { 
     // Creating the JFrame object 
     GuiForJFrame jFrame = new GuiForJFrame(); 
     jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     // Adding Graphics to JFrame 
     GuiForDrawingGraphics graphics = new GuiForDrawingGraphics(); 
     jFrame.add(graphics); 
     jFrame.setSize(500, 200); 

     // Displaying the JFrame properly. 
     jFrame.pack(); 
     jFrame.validate(); 
     jFrame.setVisible(true); 
    } 
} 

除此之外,你將不得不使用setPreferredSize(Dimension dimension)方法來指定您希望每個JComponent成爲大小。

查看JComponentJFrame課程http://docs.oracle.com/javase/7/docs/api/瞭解更多信息。

1

JFrame默認使用BorderLayout,所以當你不指定任何佈局時它的工作原理是因爲你的面板將被添加到BorderLayout的中心。

但是當您指定FlowLayout時,我並不建議您這樣做,因爲它會將所有組件排列在行上,然後在需要時將它們exapend多行。另一件事FlowLayout不能得到您的preferredSize,並且您需要在您的自定義面板上提供此大小。

流程佈局讓每個組件都採用其自然(首選)大小。

http://docs.oracle.com/javase/7/docs/api/java/awt/FlowLayout.html

所以你可以指定你的面板尺寸,例如在面板的paintComponent:

setSize(200, 100); // values depend on your components 

或使用任何其他的佈局像一個默認(BorderLayout的)或其他類型像BoxLayout,它取決於你想要的框架看起來像

請參閱此爲更多佈局類型: http://docs.oracle.com/javase/tutorial/uiswing/layout/index.html