(cardLayout を使用して) cardPal 内にネストされた 2 つの JPanel があります。
ページを切り替えるときは、ページの新しいインスタンスを作成する必要があります。たとえば、homePage から captchaPage に切り替えると、現在の homePage を「HomePage」の新しいインスタンスに置き換えます。captchaPage から homePage に切り替える場合も同様です。
問題なく新しいインスタンスを作成しますが、画面に表示されるのは JPanels の古いビューであり、再描画されていないことを意味します。
この問題を検索しましたが、ほとんどすべての解決策で、パネルで revalidate()、validate()、または repaint() を呼び出すことが提案されています。
私はそれをすべてやりましたが、それでも古いビューを取得します。コンソールでキャプチャを印刷すると、キャプチャが変更されていることがわかりますが、ビューは同じままであるため、新しいインスタンスの作成は正常に行われたと確信しています。
これが私の構造です:
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);
}
}
ダッシュボード.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;