GridBagLayout位于BoxLayout的中心,而不是位于顶部

时间:2013-08-27 11:48:43

标签: java swing

以下示例介绍了以下应用:

BorderLayout的NORTH上的按钮,将GridBagLayout面板与一些组件添加到BorderLayout.CENTER内的BoxLayout.Y_AXIS。但单击按钮后,面板将显示在中央,而不是添加到顶部。

public class Test extends JFrame {
    public Test() {
        super("Test");
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

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

        JButton add = new JButton("Add");
        add.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                panel.add(new RecordPanel("text1", "text2"));
                panel.revalidate();
            }
        });

        Container container = getContentPane();
        container.add(add, BorderLayout.PAGE_START);
        container.add(panel, BorderLayout.CENTER);

        setSize(300, 500);
        setVisible(true);
    }

    public static void main(String[] args) {
        new Test();
    }

    private class RecordPanel extends JPanel {
        private JRadioButton radioButton;
        private JLabel textLabel1;
        private JLabel textLabel2;

        public RecordPanel(String text1, String text2) {
            super();
            radioButton = new JRadioButton();
            textLabel1 = new JLabel(text1);
            textLabel2 = new JLabel(text2);
            initGUI();
        }

        private void initGUI() {
            setLayout(new GridBagLayout());
            GridBagConstraints constraints = new GridBagConstraints();

            constraints.gridx = 0;
            constraints.gridy = 0;
            add(radioButton, constraints);

            constraints.gridx = 1;
            constraints.gridy = 0;
            constraints.weightx = 1.0;
            constraints.fill = GridBagConstraints.HORIZONTAL;
            add(textLabel1, constraints);

            constraints.gridx = 1;
            constraints.gridy = 1;
            constraints.weightx = 1.0;
            constraints.fill = GridBagConstraints.HORIZONTAL;
            add(textLabel2, constraints);
        }
    }
}

使用锚点(constraints.anchor = GridBagConstraints.FIRST_LINE_START)设置单选按钮和一个标签到顶部,但第二个标签仍然出现在中心。

如何让面板显示在顶部而不是中心?

3 个答案:

答案 0 :(得分:1)

问题是,对于新添加的Integer.MAX_VALUE组件,最大大小默认定义为Integer.MAX_VALUE x RecordPanel,导致使用最大可用区域。此维度由BoxLayout观察。

您可以覆盖课程getMaximumSize

中的RecordPanel
@Override
public Dimension getMaximumSize() {
   return new Dimension(300, getPreferredSize().height);
}

documentation详细了解如何使用BoxLayout

实现尺寸调整

答案 1 :(得分:0)

如果您不介意使用MigLayout而不是BoxLayout,这可能是您的解决方案:

首先,将面板布局更改为MigLayout:

panel.setLayout(new MigLayout("", "[]", "[]"));

为类创建一个静态变量,以计算新的`RecordPanel'元素添加到哪一行:

public class Test extends JFrame {
    static int index = 0;

然后将add替换为面板行:

panel.add(new RecordPanel("text1", "text2"), "cell 0 " + index++);

这会将每个新的RecordPanel插入一个新行,这要归功于index总是递增。

您可能希望将面板包装到ScrollView中,以便在元素填充面板时添加滚动条。

答案 2 :(得分:0)

元素GridBagConstraints.anchor是正确的选择,但你必须使用GridBagConstraints.NORTH中的一个来GridBagConstraints.NORTHWEST。

例如constraints.anchor = GridBagConstraints.NORTH