我有兩個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;
感謝您的回覆。首先根據您的指示更改我的代碼。 我仍然有這個問題,所以請讓我知道我哪裏錯了。關於您的問題,我需要更改這些項目,因爲它們的數據不是靜態的,例如captchaPage每次顯示不同的短語或用戶可能會在他的主頁上發送通知。 – mdoust
將頁面添加到cardPanel時,我犯了一個微不足道的錯誤。再次感謝您的解決方案。 – mdoust