我有一個包含具有不同GUI組件的其他面板的JPanel,其中包含具有動作偵聽器的按鈕。在某些時候,我想刪除一些組件並添加新的組件。所以我嘗試刪除主JPanel上的所有組件,然後添加新的組件。當我運行removeAll()
方法時,出現堆棧溢出錯誤。我也嘗試一次刪除一個組件,但我仍然遇到這個問題。嘗試了不同的組合/ in/re/validate,但舊組件不會被刪除。這是我最後一次嘗試:從JPanel中刪除組件時出現StackOverFlowError
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:
我做了一些調試,發現了以下內容:我有被添加到當前面板JPanels的數組。所以刪除數組JPanels的子元素並不是問題,但是當我嘗試刪除數組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]);
}
我得到的堆棧溢出錯誤。
減少計數您只需查看堆棧跟蹤後調用
getComponentCount
。你會看到你做了什麼樣的循環。我們無法用當前信息解決此問題 – Robin 2013-02-08 14:55:33您的遞歸在哪裏?你可能沒有意識到,但它存在於你的代碼中的某處。另外,使用CardLayout交換視圖會更好嗎? – 2013-02-08 14:55:43
use.a.debugger。 – mre 2013-02-08 15:00:01