2012-11-29 69 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);