-5

我有一个 JPanel,其中包含具有不同 GUI 组件的其他面板,包括带有动作侦听器的按钮。在某些时候,我想删除一些组件并添加新组件。所以我尝试删除主 JPanel 上的所有组件,然后添加新组件。当我运行该removeAll()方法时,出现堆栈溢出错误。我也尝试一次删除一个组件,但我仍然遇到这个问题。还尝试了使用 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 回答