0

下面的示例描述了以下应用程序:

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) 将单选按钮和一个标签设置到顶部,但第二个标签仍然出现在中心。

如何使面板出现在顶部而不是中心?

4

3 回答 3

1

问题在于,对于新添加的组件,最大尺寸默认定义为Integer.MAX_VALUEx ,从而导致使用最大可用区域。该维度由 观察。Integer.MAX_VALUERecordPanelBoxLayout

getMaximumSize你可以在课堂上覆盖RecordPanel

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

文档详细介绍了如何使用BoxLayout

于 2013-08-27T12:30:29.597 回答
0

元素 GridBagConstraints.anchor 是正确的选择,但您必须使用这些值之一 GridBagConstraints.NORTH 到 GridBagConstraints.NORTHWEST。

例如constraints.anchor = GridBagConstraints.NORTH

于 2013-08-27T12:36:14.790 回答
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 中,以便在元素填充面板时添加滚动条。

于 2013-08-27T12:33:50.577 回答