2012-01-17 61 views
1

今天我有一个小问题,这可能是没有什么优点:)Java - 我应该使用什么样的Swing布局?

我想在一条水平线中使用我的Swing组件。我使用FlowLayout并根据框架大小改变了componentResized()上的组件大小,但它经常被窃听(有时最后一个组件放在下一行)...我决定使用BoxLayout,但在代码上:

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无法使第二排,或使箱布置工作?

感谢您的回复!

+0

可能的重复:http://stackoverflow.com/questions/761341/boxlayout-cant-be-shared-error – Yossale 2012-01-17 15:15:41

回答

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应该允许以满足您的需求

+0

是的,问题是,你试图创建自己的JPanel的布局..在那一点上, JPanel尚未正确初始化,无法安全使用。 – Alex 2012-01-17 15:16:31

+0

是的,工作:)非常感谢 – 2012-01-17 15:17:13

1

我经常发现GridBagLayout中有足够的灵活性和控制能力做什么,我需要。

2

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

2

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

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