如何在运行时将 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}
的组件列表
我创建了一个父容器,我在上面放置了几个 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}