如何在运行时将 JPanel 保持在父容器的顶部?

How to keep JPanel at top of parent container at runtime?

我创建了一个父容器,我在上面放置了几个 JPanel 对象,每个对象包含几个 JButton 对象。

我创建父面板,添加 GridBagConstraints 然后将每个子面板添加到父面板:

final JPanel options = new JPanel(new GridBagLayout());
        options.setBorder(new TitledBorder("Select Option"));
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.gridwidth = GridBagConstraints.REMAINDER;
        gbc.fill = GridBagConstraints.HORIZONTAL;
        gbc.weightx = 1.0;
        gbc.anchor = GridBagConstraints.NORTH;

        options.add(findPanel, gbc);
        options.add(addPanel, gbc);
        options.add(changePanel, gbc);
        options.add(dropPanel, gbc);
        gbc.weighty = 1.0;
        options.add(new JPanel(), gbc);

options.add(new JPanel(), gbc); 用于占用我想要的面板下的额外 space。效果很好....直到我想在用户交互后更改父级的内容:

partnoFai.addActionListener(new ActionListener(){
                public void actionPerformed(ActionEvent ae){
                    options.remove(findPanel);
                    options.remove(addPanel);
                    options.remove(changePanel);
                    options.remove(dropPanel);
                    options.add(partnoFaiInp, gbc);
                    gbc.weighty = 1.0;
                    options.add(new JPanel(), gbc);
                    frame.pack();
                    frame.validate();
                } 
            } );

它正在将新面板 options.add(partnoFaiInp, gbc); 添加到父级的中间,当我希望它位于顶部时。为什么 gbc.anchor = GridBagConstraint.NORTH; 不将新面板保留在面板的 NORTH 中?

感谢任何帮助。

你必须从堆栈的角度来考虑Container

当您第一次设置面板时使用...

options.add(findPanel, gbc);
options.add(addPanel, gbc);
options.add(changePanel, gbc);
options.add(dropPanel, gbc);
gbc.weighty = 1.0;
options.add(new JPanel(), gbc);

容器的组件列表看起来像 {findPanel, addPanel, changePanel, dropPanel, JPanel}

当您删除组件时使用类似...

options.remove(findPanel);
options.remove(addPanel);
options.remove(changePanel);
options.remove(dropPanel);

容器现在有一个看起来像 {JPanel}

的组件列表

然后当您使用...添加新组件时...

options.add(partnoFaiInp, gbc);
gbc.weighty = 1.0;
options.add(new JPanel(), gbc);

容器现在有一个看起来像 {JPanel, partnoFaiInp, JPanel}

的组件列表

因此,您可以在添加面板时指定面板的插入点,而不是添加另一个 "filler" 组件...

options.add(partnoFaiInp, gbc, 0);
frame.pack();
frame.validate();

容器现在有一个看起来像 {partnoFaiInp, JPanel}

的组件列表