-5

アクションリスナーを持つボタンを含む、さまざまな GUI コンポーネントを持つ他のパネルを含む JPanel があります。ある時点で、一部のコンポーネントを削除して新しいコンポーネントを追加したいと考えています。そこで、メイン JPanel のすべてのコンポーネントを削除してから、新しいコンポーネントを追加しようとしました。メソッドを実行するremoveAll()と、スタック オーバーフロー エラーが発生します。また、一度に 1 つのコンポーネントを削除しようとしましたが、それでも問題が発生します。in/re/validate とのさまざまな組み合わせも試しましたが、古いコンポーネントは削除されません。最後に試したのは次のとおりです。

public void updateSuites() {
    removeAll();

    //for(int i = 0; i < getComponentCount(); i++)
      //remove(getComponent(i));

    invalidate();
    showGui();

    revalidate();
    repaint();
}

ここで何が問題なのですか?

編集:

コードは次のとおりです。

public void updateSuites() {

    for(int i = 0; i < getComponentCount(); i++)
      if(!(getComponent(i) instanceof ControlPanel))
        remove(getComponent(i));

    invalidate();
    showGui();

    revalidate();
    repaint();
}

JPanel を拡張するクラスがあり、さらに多くのパネルとコンポーネントがあります。また、いくつかのボタンとその上にある ControlPanel もあります。そのため、ControlPanel のボタンが押されると、親パネルでこのメソッドが呼び出され、ControlPanel 自体 (呼び出し元) 以外のすべてが削除されるはずです。しかし、スタックオーバーフローが発生します:

Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError
    at java.awt.AWTEventMulticaster.remove(Unknown Source)
    at java.awt.AWTEventMulticaster.removeInternal(Unknown Source)
    at java.awt.AWTEventMulticaster.remove(Unknown Source)
    at java.awt.AWTEventMulticaster.removeInternal(Unknown Source)
    at java.awt.AWTEventMulticaster.remove(Unknown Source)
    at java.awt.AWTEventMulticaster.removeInternal(Unknown Source)
    at java.awt.AWTEventMulticaster.remove(Unknown Source)
    at java.awt.AWTEventMulticaster.removeInternal(Unknown Source)

編集2:

少しデバッグを行ったところ、次のことがわかりました。 現在のパネルに追加された JPanel の配列があります。したがって、配列 JPanel の子を削除しても問題はありませんが、配列 JPanel を削除しようとすると問題が発生します。コードは次のようになります。

for(int i = 0; i < panels.length; i++) {
      panels[i] = new JPanel();
      // add components to panels[i]
      add(panels[i]);
}

だから私が走れば

for(int i = 0; i < panels.length; i++) {
      remove(panels[i]);
}

スタック オーバーフロー エラーが発生します。

4

1 に答える 1

4

私はこれを試してみます:

for (int i = getComponentCount() - 1; i >= 0; i--) {
    remove(getComponent(i));
}

削除するたびに呼び出しgetComponentCountているため、カウントが 1 減少します。

于 2013-02-08T15:14:41.630 に答える