1

構造は次のようになります。

フレームと 2 つのボタンがあります - 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();
    }
}
4

1 に答える 1

2

contentPane にA.createPanel()andを追加していますが、componentMap にandを保存しています。したがって、 を呼び出すと、コンテンツ ペインにないおよび/またはでこれを実行しているため、何も削除しません。B.createPanel()ABthis.getContentPane().remove((JPanel)o);AB

コンテンツ ペインをクリアする場合は、よりシンプルで安全な方法を使用できます。

this.getContentPane().removeAll();
于 2012-05-29T07:18:59.720 に答える