2012-01-17 50 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