1

(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;
4

1 に答える 1