【发布时间】:2020-04-05 18:09:27
【问题描述】:
我有一个主要的JPanel 容器和三个 JPanel。如何清空此面板并添加新面板?我尝试使用remove(Component),但它不起作用。有人可以给我建议吗?
【问题讨论】:
-
在您的 JPanel 中移除组件后,您是否验证和/或重新绘制?
-
另请注意,某些
LayoutManagers 不允许您从他们管理的面板中删除组件。
我有一个主要的JPanel 容器和三个 JPanel。如何清空此面板并添加新面板?我尝试使用remove(Component),但它不起作用。有人可以给我建议吗?
【问题讨论】:
LayoutManagers 不允许您从他们管理的面板中删除组件。
这样就可以了。诀窍是调用 revalidate。
mainPanel = ...
mainPanel.removeAll();
mainPanel.add(newPanel1);
mainPanel.add(newPanel2);
mainPanel.add(newPanel3);
mainPanel.revalidate();
但实际上,如果您想更改 JPanel 中显示的内容,请考虑使用 CardLayout。
【讨论】:
pack()(JDialog 或 JFrame)以获得正确的大小。
在link 中,我找到了一个关于如何在面板中添加和删除元素的简单教程。 主面板中的其他面板也是元素,因此同样的原则适用于它们。
在面板中添加新内容时的一个好习惯不仅仅是使用方法 add(): 我们可能还想使用 revalidate() 和 repaint() 它们应该在某些事件发生时调用(单击按钮或类似...)
我还想提一下,在教程 remove() 中我被用来删除元素,你这样做是正确的。可能为其他面板再次调用 revalidate() 和 repaint() 会使删除的面板从 GUI 中消失(对象被删除,只是 GUI 没有刷新)
注意:我想你的内部面板的元素是可见的 = true。如果某些内部元素难以渲染,请尝试对它们调用 revalidate() 和 repaint()。 我认为这种方式应该可行。
【讨论】:
@哈里·乔伊
如果您添加或删除(已经可见的容器),那么您必须调用
revalidate();
repaint(); // not required in all cases
@达米尔 如果 JComponents 不是公共(或私有)静态的,那么您可以调用
myContainer.removeAll();
myContainer.revalidate();
nyCOntainer.repaint();
可能是通过Component[] a = myContainer.getComponents(); 的某些参数删除JComponent(s) 然后您可以调用if (components[i] instanceof JComboBox) { ...
【讨论】:
尝试其他删除方法remove(int index);
【讨论】:
这 100% 有效
this.panelname.Controls.Clear();
【讨论】:
我也有同样的问题。我为解决这个问题所做的只是
panelName.setVisible(false);
mainPanel.remove(panelName);
在我的例子中,panelName 是一个位于 mainPanel 内的 JPanel。
【讨论】: