2013-08-20 71 views
1

我有兩個JPanel嵌套在cardPanl(帶有cardLayout)中。無法更新CardLayout中的JPanel

當在頁面之間切換時,我需要創建新頁面的實例。例如,當我從homePage切換到captchaPage時,我將用一個新的'HomePage'實例替換當前的homePage。從captchaPage切換到homePage時也是如此。

我將創建新的實例沒有任何問題,但我在屏幕上看到的是JPanels的舊視圖,這意味着它們不會被重新繪製。

我已經搜索了這個問題,幾乎所有的解決方案都建議在面板上調用revalidate(),validate()或repaint()。

我已經完成了所有工作,仍然看到舊的視圖。我確信創建新實例已經成功完成了,因爲當在控制檯中打印capthcha時,我發現它改變了,但視圖保持不變。

這裏是我的結構:


BasicPage.java

public class BasePage extends JPanel { 
    protected JFrame parent; 
    protected String name; 
    public BasePage(JFrame parent, String name) { 
     this.parent = parent; 
     this.name = name; 
     // ... 
    } 
} 


CaptchaPage.java

public class CaptchaPage extends BasePage { 
    private String challenge; 
    public CaptchaPage(JFrame parent, String name) { 
     super(parent, name); 
     challenge = new BigInteger(130, new SecureRandom()).toString(32); 
     challenge = challenge.length() > 5 ? challenge.substring(0, 5) : challenge; 
     JLabel label = new JLabel(challenge); 
     this.add(label); 
    } 
} 


Dashboard.java

public class Dashboard extends JFrame { 
    private JPanel cardPanel; 

    private BasePage homePage; 
    private BasePage captchaPage; 

    public Dashboard() { 
     cardPanel = new JPanel(); 
     cardPanel.setLayout(new CardLayout()); 

     homePage = new HomePage(this, "0"); 
     captchaPage = new CaptchaPage(this, "1"); 

     cardPanel.add(homePage, "0"); 
     cardPanel.add(captchaPage, "1"); 

     this.add(cardPanel); 
    } 

    protected void switchPage(String name) {   
     ((CardLayout)cardPanel.getLayout()).show(cardPanel, name); 

     if (name.equals("1")) { 
      homePage = new HomePage(this, "0"); 
      homePage.revalidate(); 
     } 
     else { 
      captchaPage = new CaptchaPage(this, "1"); 
      captchaPage.revalidate(); 
     } 
    }  
} 


回答

BasePage page = new HomePage(this, "0"); 
cardPanel.add(page, "0"); 
cardPanel.revalidate(); 
homePage = page; 

回答

3

您添加面板到CardLayout用下面的代碼是正確的:

cardPanel.add(homePage, "0"); 
cardPanel.add(captchaPage, "1"); 

現在你正在嘗試用以下代碼更新CardLayout:

homePage = new HomePage(this, "0"); 

這是行不通的。你所做的只是改變主頁變量的參考。您尚未將組件添加到CardLayout。

要改變面板則代碼應該是一樣的,你最初用來增加面板的代碼:

JPanel homepage = new HomePage(...); 
cardPanel.add(...); 

你爲什麼要在面板上改變組件?爲什麼網頁改變了。聽起來像一個奇怪的設計給我。

+0

感謝您的回覆。首先根據您的指示更改我的代碼。 我仍然有這個問題,所以請讓我知道我哪裏錯了。關於您的問題,我需要更改這些項目,因爲它們的數據不是靜態的,例如captchaPage每次顯示不同的短語或用戶可能會在他的主頁上發送通知。 – mdoust

+0

將頁面添加到cardPanel時,我犯了一個微不足道的錯誤。再次感謝您的解決方案。 – mdoust