2

我已经多次成功使用 createVerticalGlue()。但是在以下屏幕构建代码中它不起作用。我仍然想知道为什么。

情况是我在另一个面板(centralPanel)中有两个 JPanel(leftPanel,rightPanel)。这两个面板中的每一个都将使用 BoxLayout Y 轴托管两个 JComponent。我想在两个 JComponent 之前、之间和之后分配剩余的可用空间。

我知道我可以使用空白边界和刚性区域来解决问题,但碰巧我有点头脑不清醒!

我很抱歉这个长问题。

    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);   

        }
    }
4

1 回答 1

3

afaics,centralPanel 有默认的 layoutManager,也就是 FlowLayout。这总是将其子项的大小调整为他们的 prefSize,因此胶水永远不会发挥作用。

嵌套容器是有代价的(像@Andrew 这样的嵌套向导很乐意支付 :-) 此外,要做到正确也不是一件容易的事(fi 用组合框替换上面的 textField 以查看错位)。从长远来看,几乎没有一条可以学习掌握更强大的管理器的途径,比如 fi MigLayout(我目前个人最喜欢的)

于 2012-08-21T06:38:55.527 回答