我已成功多次使用createVerticalGlue()。但是,在以下屏幕构建代码中,它无法正常工作。我仍然想知道为什么。
情况是我在另一个Panel(centralPanel)中有两个JPanels(leftPanel,rightPanel)。这两个面板中的每一个都将使用BoxLayout Y轴托管两个JComponents。我想在两个JComponents之前,之间和之后分配剩余的可用空间。
我知道我可以使用空白边框和刚性区域来解决问题,但碰巧我有点难以接受!
我对长期问题的批评。
public class MemberGUI extends JFrame {
JPanel contPane = (JPanel) this.getContentPane();
JPanel centralPanel = new JPanel();
JPanel leftPanel = new JPanel();
JPanel rightPanel = new JPanel();
JPanel lowerPanel = new JPanel();
JLabel title = new JLabel("Add/Delete Member");
JLabel nameLbl = new JLabel("Member's name");
JLabel idLbl = new JLabel ("Member ID");
JTextField nameFld = new JTextField(10);
JTextField idFld = new JTextField(10);
public void buildMe(){
//LayoutManagers
contPane.add(title,BorderLayout.PAGE_START);
contPane.add(centralPanel,BorderLayout.CENTER);
contPane.add(lowerPanel,BorderLayout.PAGE_END);
centralPanel.add(leftPanel);
centralPanel.add(rightPanel);
leftPanel.setLayout(new BoxLayout(leftPanel,BoxLayout.Y_AXIS));
rightPanel.setLayout(new BoxLayout(rightPanel,BoxLayout.Y_AXIS));
//leftPanel.add(Box.createRigidArea(new Dimension(0,50)));
leftPanel.add(Box.createVerticalGlue());
leftPanel.add(idLbl);
leftPanel.add(Box.createVerticalGlue());
leftPanel.add(nameLbl);
leftPanel.add(Box.createVerticalGlue());
//rightPanel.add(Box.createRigidArea(new Dimension(0,50)));
rightPanel.add(Box.createVerticalGlue());
rightPanel.add(idFld);
rightPanel.add(Box.createVerticalGlue());
rightPanel.add(nameFld);
rightPanel.add(Box.createVerticalGlue());
// JFrame Settings
this.setSize(500,400);
this.setResizable(false);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocationRelativeTo(null);
this.setVisible(true);
}
}
答案 0 :(得分:3)
afaics,centralPanel有默认的layoutManager,即FlowLayout。这总是将孩子的大小调整为prefSize,因此胶水永远不会发挥作用。
嵌套容器是有代价的(像@Andrew这样的嵌套向导很乐意支付:-)而且,要正确起来并不是完全无关紧要的(f.i.用一个comboBox替换上面的textField来查看错误对齐)。从长远来看,几乎没有办法学习掌握一个更强大的经理,比如f.i. MigLayout(我目前个人最喜欢的)