cardPanl 내부에 두 개의 JPanel이 중첩되어 있습니다 (cardLayout 포함).CardLayout 내부의 JPanels를 업데이트하지 못했습니다.
페이지를 전환 할 때 페이지의 새 인스턴스를 만들어야합니다. 예를 들어 홈 페이지에서 captchaPage로 전환 할 때 현재 홈 페이지를 'HomePage'의 새 인스턴스로 바꿉니다. captchaPage에서 homePage로 전환 할 때도 마찬가지입니다.
아무런 문제없이 새 인스턴스를 만들지 만 화면에 표시되는 것은 JPanels가 다시 그려지지 않은 것을 의미하는 오래된 뷰입니다.
이 문제를 검색 한 결과 거의 모든 솔루션에서 패널에서 revalidate(), validate() 또는 repaint()를 호출하는 것이 좋습니다.
나는 그것을 모두했지만 아직도 나는 옛 시각을 얻는다. 콘솔에 captchcha를 인쇄 할 때 변경 사항이 있지만보기가 동일하기 때문에 새 인스턴스를 만드는 것이 성공적으로 완료되었다고 확신합니다. 여기
내 구조 :
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);
}
}
이제
cardPanel.add(homePage, "0");
cardPanel.add(captchaPage, "1");
당신이하려고 :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;
답변 해 주셔서 감사합니다. 먼저 귀하의 지시에 따라 코드를 변경합니다. 아직도 문제가 있으므로 어디서 잘못 가고 있는지 알려주세요. 귀하의 질문에 관해서는 데이터가 정적이 아니기 때문에 이러한 항목을 변경해야합니다. 예를 들어 captchaPage는 매번 다른 문구를 표시하거나 사용자는 자신의 홈페이지에서 알림을받을 수 있습니다. – mdoust
cardPanel에 페이지를 추가 할 때 사소한 실수를했습니다. 솔루션에 다시 한번 감사드립니다. – mdoust