FlowLayout问题

public class MyFrame extends JFrame { public MyFrame(String title) { setSize(200, 200); setTitle(Integer.toString(super.getSize().width)); setLayout(new FlowLayout()); for (int i = 0; i < 5; ++i) { JButton b = new JButton(); b.setSize(90,50); b.setText(Integer.toString(b.getSize().width)); this.add(b);![alt text][1] } this.setVisible(true); } } 

为什么如果有按钮widht 90我有窗口,其中三个按钮在一行而不是两个?

FlowLayout将从左到右(或从右到左)布置Component 。 如果您希望显式设置每个JButton的大小,则应使用setPreferredSize而不是setSize因为布局管理器通常在执行布局时使用最小,首选和最大大小。

大小属性非常混乱 – 这里有一篇有趣的文章。 特别注意:

尺寸属性是否始终受到尊重?

某些布局管理器(如GridLayout) 完全忽略大小属性

FlowLayout尝试遵循preferredSize的两个维度,并且可能不需要遵守minimumSize或maximumSize。

FlowLayout只是按照从左到右的顺序将组件1放在另一个旁边。 当宽度到达具有该布局的容器之一时,它只是包裹在另一行上。

如果要将它们排列成网格样式的布局(就像你想要的那样),你可以使用GridLayout来指定列数和行数:

 component.setLayout(new GridLayout(2,2)) 

GridLayout的唯一缺点是网格的每个单元格都具有相同的大小(如果你只有JButtonsJLabels通常会很好,但是当你混合它时它会在视觉上很糟糕)。

如果你真的需要更多function,请使用GridBagLayout ,非常可定制,但开始时学习曲线更陡峭。

可能你的大小问题与你使用setSize但在Swing中这些东西有奇怪的行为,你应该尝试设置setPreferredSize(200,200)而不是setSize 。 但不要问我为什么!

注意您应始终参考框架的内容窗格,而不是它自己的框架。 当你设置布局时,你应该做getContentPane().setLayout(..) ,当你添加项目时,你应该做getContentPane().add(..)等等。

勘误表:现在每个JFrame自动addremovesetLayout转发到内容窗格。

首先,您没有正确使用JFrame :您不直接向框架添加组件,将它们添加到JPanel ,然后使用setContentPane()传递给框架。

另外:直接将JFrame子类JFrame添加组件并不是很优雅。 而是将您的框架创建为单独的对象。