アクションリスナーを持つボタンを含む、さまざまな 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]);
}
スタック オーバーフロー エラーが発生します。