2012-11-29 70 views
3

我正在做一個java中的小Gui。我使用setBounds方法來設置按鈕等在我的JFrame上的位置,但問題是,當我用JPanel按鈕在JFrame上不可見時,並且沒有JPanel它相當好,請看這兩個代碼,請幫助我我是初學者,面對這些愚蠢的問題。Java setBounds與JPanel不兼容

這一個是工作的罰款

JFrame jframe = new JFrame("Working Fine"); 
    jframe.setLayout(null); 
    JButton jbutton = new JButton("Position Test"); 
    jbutton.setBounds(0, 0, 100, 100); 
    jframe.add(jbutton); 
    jframe.setSize(300,300); 
    jframe.setVisible(true); 

相同的代碼當我添加按鈕的JPanel那麼它不那麼什麼是錯的工作,請指導我

JFrame jframe = new JFrame("causing problem "); 
    jframe.setSize(300,300); 
    JPanel p = new JPanel(); 
    jframe.setLayout(null); 
    JButton jbutton = new JButton("Position Test"); 
    jbutton.setBounds(0, 0, 100, 100); 
    jframe.add(p); 
    p.add(jbutton); 
    p.setVisible(true); 
//jframe.add(jbutton); 
    jframe.setVisible(true); 

請幫我在這個小問題

+3

'setLayout(null)','setBounds(0,0,100,100)'和'setSize(300,300)'是非常糟糕的做法。 –

+1

您不應該使用空佈局。閱讀這個佈局管理器教程:http://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html –

+0

我正在學習Java並且還沒有被教過佈局管理器,我們的教師要求我們使用null直到我們去通過LayoutManagers,所以沒有使用它們。你能指導我在這裏錯了嗎? –

回答

5

問題是,當您使用絕對定位時,JPanel組件沒有默認大小,因此不會出現。爲了得到它的出現,你可以做

JFrame frame = new JFrame("No Problem"); 
JPanel panel = new JPanel() { 
    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(300, 300); 
    }; 
}; 
panel.setLayout(new FlowLayout(FlowLayout.CENTER)); 
JButton button = new JButton("Position Test"); 
panel.add(button); 
frame.add(panel); 
frame.pack(); 
frame.setVisible(true); 

Doing Without a Layout Manager

雖然可能沒有佈局管理器做的,你應該使用一個佈局管理器,如果在所有可能的。佈局管理器可以更輕鬆地調整到與外觀相關的組件外觀,不同的字體大小,容器的不斷變化的大小以及不同的區域設置。

佈局管理器的選擇取決於您希望如何佈置組件。

請參閱A Visual Guide to Layout Managers

+0

我是學生,還沒有學到它,好吧請引導我哪一個我應該用作初學者,您的答案被接受..謝謝 –

4

你必須擺脫JPanel的佈局,以設置絕對位置:

p.setLayout(NULL);