0

JavaスイングライブラリのremoveとremoveAllの違いは何ですか? 1 つのコントロール パネルと、コントロール パネルで変更できるパネルがあります。この変更は、親フレーム オブジェクトで行われます。コードを使用する場合:

public void showNextPanel(){
        if(hasNextPanel()){
            getSelectedPanel().setVisible(false);
            getContentPane().removeAll();
            getContentPane().add(controlPanel);
            selectedPanel++;
            getContentPane().add(getSelectedPanel());
            getSelectedPanel().setVisible(true);
            revalidate();
            repaint();
        }else{
            System.exit(0);
        }
    }

その後、すべてが期待どおりに機能します。remove ステートメントで removeAll を変更すると、この選択されたパネルは灰色になりますが、表示されたままになります。フレームのサイズを変更すると、新しいフレームが表示され、前に選択したパネルの後ろに隠れていることがわかります。次に、私のコードは次のとおりです。

public void showNextPanel(){
        if(hasNextPanel()){
            getSelectedPanel().setVisible(false);
            getContentPane().remove(getSelectedPanel());
            selectedPanel++;
            getContentPane().add(getSelectedPanel());
            getSelectedPanel().setVisible(true);
            revalidate();
            repaint();
        }else{
            System.exit(0);
        }
    }

removeAll を使用すると JPanel が消えるのに、remove を使用すると消えないのはなぜですか?

4

1 に答える 1

3

メソッド名は大きなヒントであり、決定的な答えは javadocs にあります。

の場合Container.remove(Component):

「指定されたコンポーネントをこのコンテナから削除します。」

の場合Container.removeAll():

「このコンテナからすべてのコンポーネントを削除します。」

動作の違いの原因については、最初のケースでは削除されているが、2 番目のケースでは削除されていない他のコンポーネントがパネルにあると思います。

getComponentCount()どちらの場合も、「削除」後に呼び出してログ/印刷してみてください。

于 2013-04-18T14:45:27.563 に答える