【问题标题】:Failure to update JPanels inside CardLayout未能更新 CardLayout 中的 JPanel
【发布时间】:2013-08-20 19:00:57
【问题描述】:

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

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

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

我已经搜索过这个问题,几乎所有的解决方案都建议在面板上调用 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);
    }
}


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;

【问题讨论】:

    标签: java swing jpanel repaint cardlayout


    【解决方案1】:

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

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

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

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

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

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

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

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

    【讨论】:

    • 感谢您的回复。首先,我根据您的指示更改我的代码。我仍然有问题,所以请让我知道我哪里出错了。关于您的问题,我需要更改这些项目,因为它们的数据不是静态的,例如 captchaPage 每次显示不同的短语,或者用户可能在其主页上收到通知。
    • 我在将页面添加到cardPanel时犯了一个小错误。再次感谢您的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2012-10-21
    • 1970-01-01
    • 2014-05-12
    • 2013-04-15
    • 1970-01-01
    • 2012-03-01
    • 2013-04-13
    • 1970-01-01
    相关资源
    最近更新 更多