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
的唯一缺点是网格的每个单元格都具有相同的大小(如果你只有JButtons
或JLabels
通常会很好,但是当你混合它时它会在视觉上很糟糕)。
如果你真的需要更多function,请使用GridBagLayout
,非常可定制,但开始时学习曲线更陡峭。
可能你的大小问题与你使用setSize
但在Swing中这些东西有奇怪的行为,你应该尝试设置setPreferredSize(200,200)
而不是setSize
。 但不要问我为什么!
注意 : 您应始终参考框架的内容窗格,而不是它自己的框架。 当你设置布局时,你应该做 getContentPane().setLayout(..)
,当你添加项目时,你应该做getContentPane().add(..)
等等。
勘误表:现在每个JFrame
自动add
, remove
, setLayout
转发到内容窗格。
首先,您没有正确使用JFrame
:您不直接向框架添加组件,将它们添加到JPanel
,然后使用setContentPane()
传递给框架。
另外:直接将JFrame
子类JFrame
添加组件并不是很优雅。 而是将您的框架创建为单独的对象。