2012-12-28 76 views
0

我是一名Java初學者,正在爲我的程序開發一個GUI,並且我被卡在JFramesJPanels。我的目標是製作一個JFrame,其中有幾個JPanels,並且每個JPanel都有它自己的類別。JPanel JFrame單獨的類

我已經開始了,但我似乎無法讓它工作。我的代碼如下:

這是JFrame類:

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

public class TestFrame extends JFrame{ 

    private static final long serialVersionUID = 1L; 
    private JFrame f; 

    public TestFrame(){ 
     f = new JFrame("Test"); 
     f.setVisible(true); 
     f.setSize(600, 400); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     JPanel p = new TestPanel(); 
     p.setVisible(true); 
     f.add(p); 
    } 

    public static void main(String[] args){ 
     new TestFrame(); 
    } 
} 

這是JPanel類:

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

public class TestPanel extends JPanel { 

    private static final long serialVersionUID = 1L; 
    private JButton b; 
    private JTextField t; 

    public TestPanel(){ 
     b = new JButton("bla"); 
     t = new JTextField("blaadda"); 
     add(b); 
     add(t); 
     setVisible(true); 
    } 

} 
+0

也許調用f.pack(); – helsont

回答

0

你應該有setVisible作爲TestFrame構造你的最後一個方法:

f.setVisible(true); 

也沒有必要使這個ca LL爲您JPanel爲框架將其所有的子組件可見變爲可見時本身:

p.setVisible(true); 

所以這條線可以去掉。


您還有TestFrame延伸JFrame。這會創建2個框架,其中一個從不顯示。在構造函數中創建框架就足夠了。

3

你的構造函數不應該創建一個新的JFrame。你的班級(TestFrame)是你將用來創建你的窗口,而不是JFrame類。你可能有其他錯誤,但最明顯的一個就是

public TestFrame(){ 
    f = new JFrame("Test"); 
    f.setVisible(true); 
    f.setSize(600, 400); 
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    JPanel p = new TestPanel(); 
    p.setVisible(true); 
    f.add(p); 
} 

應該

public TestFrame(){ 
    //Don't create a new JFrame, you're already creating a TestFrame! 
    //call all methods on the TestFrame, not the JFrame 
    setVisible(true); 
    setSize(600, 400); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    JPanel p = new TestPanel(); 
    p.setVisible(true); 
    add(p); 
} 

你パ構造看起來不錯。然而,我會建議在TestFrame字段中製作任何面板,而不是在構造函數中使用臨時變量。最後

SwingUtilities.invokeLater(new Runnable() 
    { 
     public void run() 
     { 
      new TestFrame(); 
     } 
    } 

如果一切都失敗嘗試調用你的構造setEnabled(true)

然後創建你的窗口這樣。

希望這有助於,我已經離開Swing的OpenGL,但我記得它可能是多麼令人沮喪。

+0

+1很好地解釋了鞦韆的基本知識。 – Stefan

0
f.add(p); 
p.repaint(); 
p.revalidate(); 
+2

你應該添加上下文到這個答案;爲什麼它解決了問題? –