【发布时间】:2012-06-03 07:54:04
【问题描述】:
结构如下:
我有一个框架和两个按钮 - 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();
}
}
【问题讨论】:
-
1) 使用
CardLayout2) 为了尽快获得更好的帮助,请发布SSCCE。 -
这就是我在你的Why revalidate()/repaint() on JFrame after additions on the run ? 的这个帖子上回答的原因。
pack()不适用于此类事情,尽管您选择了该答案,因此按照 @AndrewThompson 的建议,如果您想让与revalidate()/repaint()相关的头痛远离自己,请使用 CardLayout :-)