2017-03-24 125 views
0

我有一個JFrame的子類,並在其中有下面的佈局。我有一個大panel和一個小buttonsPanel與兩個JButtons。我將按鈕添加到較小的面板並將該面板添加到第一個面板。按鈕應該居中,但它不會發生。在嵌套JPanel中心對齊JButton(BoxLayout)

panel=new JPanel(); 
add(panel); 
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); 

JButton button1=new JButton("button1"); 
JButton button2=new JButton("button2"); 

buttonsPanel=new JPanel(); 
buttonsPanel.setLayout(new BoxLayout(buttonsPanel, BoxLayout.X_AXIS)); 

buttonsPanel.add(button1, CENTER_ALIGNMENT); 
buttonsPanel.add(button2, CENTER_ALIGNMENT); 
panel.add(buttonsPanel, BorderLayout.CENTER); 

我該怎麼辦?

+0

應該垂直居中還是水平居中? – VGR

+0

@VGR,Horizo​​ntaly。 – parsecer

回答

2

你真的需要閱讀關於Layout Managers的Swing教程。您需要了解「約束」是什麼以及何時使用它。

buttonsPanel.add(button1, CENTER_ALIGNMENT); 

按鈕面板使用BoxLayout。它不支持任何約束,因此CENTER_ALIGNMENT沒有任何意義。

panel.add(buttonsPanel, BorderLayout.CENTER); 

此外,面板使用BoxLayout。你不能只使用BorderLayout約束。

到框架上中心中的部件(垂直和水平的最簡單方法是使用GridBagLayout的

所以基本的代碼可能是這樣的:

JPanel buttonsPanel = new JPanel(); 
buttonsPanel.add(button1); 
buttonsPanel.add(button2); 

frame.setLayout(new GridBagLayout()); 
frame.add(buttonsPanel, new GridBagConstraints()); 

如果你想嘗試使用BoxLayout的,那麼你需要在面板前,後用「膠水」:

Box vertical = Box.createVerticalBox(); 
vertical.add(Box.createVerticalGlue()); 
vertical.add(buttonsPanel); 
vertical.add(Box.createVerticalGlue()); 

再次閱讀教程有關更多的基本信息10。

+0

我在添加'buttonsPanel'之前和之後添加了'panel.add(Box.createVerticalGlue())'粘貼,刪除了錯誤的約束,但它仍然不起作用。 和膠水加空的空間...... – parsecer

+1

@parsecer那正是膠水應該在頂部和底部,所以該組件在中間垂直居中不增加空間。如果代碼不能按照您期望的方式工作,請發佈適當的[mcve]來展示問題。 – camickr