我有两个 JPanel 嵌套在一个 cardPanl 内(带有一个 cardLayout)。
在页面之间切换时,我需要创建页面的新实例。例如,当我从主页切换到验证码页面时,我会将当前主页替换为一个新的“主页”实例。从验证码页面切换到主页时也是如此。
我将毫无问题地创建新实例,但我在屏幕上看到的是 JPanel 的旧视图,这意味着它们不会被重新绘制。
我已经搜索过这个问题,几乎所有的解决方案都建议在面板上调用 revalidate()、validate() 或 repaint()。
我已经做了这一切,但我仍然有旧的看法。我确信创建新实例已成功完成,因为在控制台中打印验证码时,我看到它发生了变化,但视图保持不变。
这是我的结构:
基本页面.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;