Java setBounds不能与JPanel一起使用

时间:2012-11-29 19:46:53

标签: java swing jpanel layout-manager

我在java中做一个小Gui。我正在使用setBounds方法在我的JFrame上设置按钮等的位置,但问题是,当我使用它与JPanel按钮在JFrame上不可见,并且没有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);

请帮我解决这个小问题

2 个答案:

答案 0 :(得分:6)

问题在于,当您使用绝对定位时,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

答案 1 :(得分:5)

你必须摆脱JPanel的布局,以便设置绝对位置:

  

p.setLayout(空);