gpt4 book ai didi

java - 无法更新 CardLayout 中的 JPanel

转载 作者:行者123 更新时间:2023-11-29 05:39:06 26 4
gpt4 key购买 nike

我有两个 JPanel 嵌套在 cardPanl 中(带有 cardLayout)。

在页面之间切换时,我需要创建页面的新实例。例如,当我从主页切换到验证码页面时,我将用“主页”的新实例替换当前主页。从 captchaPage 切换到 homePage 时也是如此。

我将毫无问题地创建新实例,但我在屏幕上看到的是 JPanel 的旧 View ,这意味着它们不会被重新绘制。

我搜索过这个问题,几乎所有的解决方案都建议在面板上调用 revalidate()、validate() 或 repaint()。

我已经完成了所有工作,但我仍然持有旧观点。我确信创建新实例已成功完成,因为在控制台中打印验证码时我看到它发生了变化,但 View 保持不变。

这是我的结构:


基本页面.java

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


验证码页面.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;

最佳答案

您使用以下正确代码将面板添加到 CardLayout:

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

现在您正在尝试使用如下代码更新 CardLayout:

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

那是行不通的。您所做的只是更改主页变量的引用。您尚未将组件添加到 CardLayout。

要更改面板,代码应与您最初用于添加面板的代码相同:

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

为什么要更改面板上的组件?为什么首页变了。对我来说听起来像是一个奇怪的设计。

关于java - 无法更新 CardLayout 中的 JPanel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18343016/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com