关于动态面板的java摇摆

时间:2012-05-29 04:56:47

标签: java swing jpanel

结构喜欢这个:

我有一个框架和两个按钮 - 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 个答案:

答案 0 :(得分:2)

您要将A.createPanel()B.createPanel()添加到contentPane,但是将AB存储在componentMap中。因此,当您致电this.getContentPane().remove((JPanel)o);时,您正在A和/或B上执行此操作,这些内容不在内容窗格中,因此您不会删除任何内容。

如果要清除内容窗格,可以使用更简单/更安全的方法:

this.getContentPane().removeAll();