2013-08-20 7 views
1

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; 

답변

3

당신은 올바른 다음 코드로 CardLayout에 패널을 추가 다음과 같은 코드로 CardLayout을 업데이트하십시오 :

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

그건 작동하지 않습니다. 홈페이지 변수의 참조를 변경하는 것뿐입니다. CardLayout에 구성 요소를 추가하지 않았습니다.

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

가 왜 패널의 구성 요소를 변경 :

코드는 처음에 패널을 추가하는 데 사용되는 코드와 동일해야 다음 패널을 변경하려면? 홈페이지가 바뀌는 이유는 무엇입니까? 나에게 이상한 디자인처럼 들린다.

+0

답변 해 주셔서 감사합니다. 먼저 귀하의 지시에 따라 코드를 변경합니다. 아직도 문제가 있으므로 어디서 잘못 가고 있는지 알려주세요. 귀하의 질문에 관해서는 데이터가 정적이 아니기 때문에 이러한 항목을 변경해야합니다. 예를 들어 captchaPage는 매번 다른 문구를 표시하거나 사용자는 자신의 홈페이지에서 알림을받을 수 있습니다. – mdoust

+0

cardPanel에 페이지를 추가 할 때 사소한 실수를했습니다. 솔루션에 다시 한번 감사드립니다. – mdoust

관련 문제