2012-05-21 102 views
1

我在MainFraim中有一個主JPanel target,而另一個currentView JPanel已添加到target面板。 target面板包含帶聽衆的按鈕。然後,這些聽衆都應該改變的curretView面板的內容,這表現如下:將JPanel更改爲另一個JPanel不重繪該更改

private JPanel currentPanel; 

public void setView(String type) { 

    if (type.equals("overall")) { 
     this.currentPanel = getOverallView(); 
     frame.setTitle("BookingCalendar - Overall View"); 
     frame.validate(); 
    } else if (type.equals("guest")) { 
     this.currentPanel = getGuestView(); 
     frame.setTitle("BookingCalendar - Room View"); 
     frame.validate(); 
    } else if (type.equals("room")) { 
     currentPanel.removeAll(); 
     this.currentPanel = getRoomView(); 
     frame.setTitle("BookingCalendar - Guest View"); 
     frame.validate(); 
    } 
} 

每一個方法我稱之爲每次調用時返回新JPanel:

JPanel currentPanel = new JPanel(new MigLayout("","20 [grow, fill] 10 [grow, fill] 20", "20 [] 10 [] 20")) 

的問題是,每當我稱之爲這些方法,面板不會改變。它始終保持不變(默認:getOverallView()

我已經嘗試使用無效,驗證,重新繪製框架,以及面板,但沒有更改發生。有人請詳細說明我需要做什麼才能完全更改面板的內容。currentView

+1

您是不是忘記將面板添加到組件層次結構中? –

回答

5

您不應該每次都創建一個新的JPanel()。請爲每種類型的視圖創建一個視圖,然後使用CardLayout在它們之間切換。 CardLayout允許您將JPanels切換爲卡片。

+0

雖然我還沒有嘗試過,但我認爲它是一個更好的解決方案,然後每次調用新實例。謝謝。 – vedran

1

看起來你只是試圖移動指針,使currentView指向不同的面板。您實際上需要做的是從target中刪除currentView,然後添加新面板。

如果這是你的2幅...

JPanel target = new JPanel(); 
JPanel currentView = new JPanel(); 

並且添加了currentViewtarget是這樣的...

target.add(currentView); 

然後改變你的面板上,你需要刪除現有面板從target,並添加新的...

target.remove(currentPanel); 
currentPanel = new JPanel(); 
target.add(currentPanel); 
+0

任何關心解釋-1?我認爲這對用戶的問題是一個完全有效的解決方案。 – wattostudios

+0

同意。 CardLayout(我認爲)更好,但這可能會奏效。 1+ –

1

另外,如果你不想使用CardLayout,你可以像你一樣使JPanel成爲新的JPanel,然後調用revalidate()。