2013-02-08 56 views
-4

我有一個包含具有不同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]); 
} 

我得到的堆棧溢出錯誤。

+5

減少計數您只需查看堆棧跟蹤後調用getComponentCount。你會看到你做了什麼樣的循環。我們無法用當前信息解決此問題 – Robin 2013-02-08 14:55:33

+4

您的遞歸在哪裏?你可能沒有意識到,但它存在於你的代碼中的某處。另外,使用CardLayout交換視圖會更好嗎? – 2013-02-08 14:55:43

+1

use.a.debugger。 – mre 2013-02-08 15:00:01

回答

4

我想試試這個:

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

你每一個缺失,其由1