Java - 我应该使用什么Swing布局?

时间:2012-01-17 15:06:55

标签: java swing layout

今天我遇到了一个小问题,这对于专业人士来说可能没有任何意义:)

我希望将我的Swing组件放在一条水平线上。我根据帧大小使用了FlowLayout并更改了componentResized()上组件的大小,但它经常出错(有时最后一个组件放在下一行)...我决定使用BoxLayout,但是在那段代码上:< / p>

    down=new JPanel(new BoxLayout(down,BoxLayout.X_AXIS));
    down.setBorder(BorderFactory.createEmptyBorder(0, 10, 10, 10));
    down.add(Box.createHorizontalGlue());
    down.setPreferredSize(new Dimension(300,35));
它崩溃了:

Exception in thread "AWT-EventQueue-0" java.awt.AWTError: BoxLayout can't be shared
at javax.swing.BoxLayout.checkContainer(Unknown Source)
at javax.swing.BoxLayout.invalidateLayout(Unknown Source)
at javax.swing.BoxLayout.addLayoutComponent(Unknown Source)
at java.awt.Container.addImpl(Unknown Source)
at java.awt.Container.add(Unknown Source)
at ButtonFrame.<init>(chat.java:278)
at chat$1.run(chat.java:20)
aso...

我不知道该怎么做,也许我可以让FlowLayout无法进行第二行,或者让盒子布局工作?

感谢您的回复!

4 个答案:

答案 0 :(得分:5)

Swing tutorial about BoxLayouts

复制粘贴
JPanel listPane = new JPanel();
listPane.setLayout(new BoxLayout(listPane, BoxLayout.PAGE_AXIS));

查看在没有任何布局的情况下首次创建面板的方式,然后使用现有面板设置和创建布局。这与您的

不同
down=new JPanel(new BoxLayout(down,BoxLayout.X_AXIS));

调整此行(使其成为示例中的两个单独的语句)将删除异常。

哦,是的,BoxLayout应该允许满足您的要求

答案 1 :(得分:2)

看看http://www.miglayout.com/,它吹走了Java提供的任何东西。只要你需要做任何复杂的事情,它就会让你的生活更轻松。

答案 2 :(得分:2)

FlowLayout或BoxLayout是布局管理器。布局管理器的目标是自动计算组件位置和大小,因此不应直接修改组件的大小。在这里,使用componentResized()通知您已调整组件的大小。它可能已由布局管理器自动调整大小。如果您在此处修改组件的大小,则可能会触发另一个自动布局过程等。

指定组件大小的首选方法是在将组件添加到其容器之前设置其preferred size

答案 3 :(得分:1)

我经常发现GridBagLayout具有足够的灵活性和控制力来完成我需要的工作。