结构如下:
我有一个框架和两个按钮 - btnA、btnB
当我按下btnA时,createPanel()函数将返回一个要在框架中显示的panelA,
btnB 也是如此。
btnA和btnB可以切换。
在将面板添加到框架中之前,我使用clearPanel() 函数清除框架中的现有面板。
但问题是,当我调整大小或单击面板时,我可以看到之前应该删除的面板。
我丢失了什么吗?
public void actionPerformed(ActionEvent e) {
String buttonString = e.getActionCommand();
if (buttonString.equals("A")) {
clearPanel();
A = new APanel();
this.getContentPane().add(A.createPanel(), BorderLayout.CENTER);
this.pack();
componentMap.put("A", A);
btnB.setEnabled(true);
btnA.setEnabled(false);
}
else if (buttonString.equals("B")) {
clearPanel();
chart = new BPanel();
this.getContentPane().add(B.createPanel(), BorderLayout.CENTER);
this.pack();
componentMap.put("B", B);
btnA.setEnabled(true);
btnB.setEnabled(false);
}
}
private void clearPanel() {
if (!componentMap.isEmpty()) { // I store panels in a HashMap
for (Object o: componentMap.values()) {
this.getContentPane().remove((JPanel)o);
}
this.getContentPane().invalidate();
componentMap.clear();
}
}
最佳答案
您正在将 A.createPanel()
和 B.createPanel()
添加到 contentPane,但存储 A
和 B
在你的 componentMap 中。因此,当您调用 this.getContentPane().remove((JPanel)o);
时,您是在 A
和/或 B
上执行此操作> 不在内容 Pane 中,因此您无需删除任何内容。
如果您想清除内容 Pane ,可以使用更简单/更安全的方法:
this.getContentPane().removeAll();
关于java swing关于动态面板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10793262/