2011-08-16 4 views
6

스윙 CardLayout에 대한 설명서를 검토 중이며 어떤 카드가 현재 수업에 구워져 있는지 확인하는 방법이없는 것으로 보입니다. 그러나 현재 어떤 카드를 보여주고 있는지 레이아웃을 묻는 방법이 있어야합니다. 맞습니까?CardLayouts : 어떤 카드가 보이는지 어떻게 알 수 있습니까?

프로젝트 제약으로 인해이 기능을 하위 클래스에 추가 할 수 없으므로 이러한 기능이 없으면 구성 요소 외부의 구성 요소 상태를 추적 할 수 없다는 것을 의미합니다. (yuck!), 또는 Swing의 어딘가에 묻혀있는 다른 옵션이 있습니까? How to Use CardLayout 튜토리얼에 따르면

답변

5

,

는 개념적으로 CardLayout가 관리하는 각 구성 요소는 상위 카드를 언제든지 볼 수 있는 스택에 재생 카드 또는 트레이딩 카드와 같습니다. 그것으로 컨테이너
  • 에 추가 된 순서 에, 중 첫 번째 또는 마지막 카드를 요구함으로써

    • : 당신은 의 다음과 같은 방법으로 표시되고 카드를 선택할 수 있습니다 특정 이름
  • 와 카드를 지정하여 앞뒤로
  • 갑판 넘기 16,

    시도, fooCardLayout를 사용하여 JPanel 인스턴스 인

    Component visibleComponent = foo.getComponent(0); 
    

    .

    은 참조 :

  • +0

    응답 전에 질문을주의 깊게 읽으십시오 : 특정 카드를 보여주는 방법을 이해합니다. 외부에서 상태를 추적하는 대신 구성 요소 자체를 호출하여 어떤 카드가 표시되는지 확인하는 데 관심이 있습니다. –

    +0

    구체적으로 좀 상세 해 주실 수 있습니까? 당신이 제공 한 링크를 통해 읽은 후에, 당신이 말하는 것을 찾을 수 없습니까? –

    +1

    @ 톰, 네가 옳았다. 나는 튜토리얼을 잘못 읽었다 - 내 잘못. 내 편집을 참조하십시오. – mre

    2

    기본 튜토리얼은 여기 How to get the top card in Java's CardLayout

    을 게시 링크에서 CardLayout the best are here 또는 here

    에 대해 betweens cards in CardLayout, 예를 많이 전환하는 방법을 통해 VII

    이상

    import java.awt.BorderLayout; 
    import java.awt.CardLayout; 
    import java.awt.event.HierarchyEvent; 
    import java.awt.event.HierarchyListener; 
    import javax.swing.JButton; 
    import javax.swing.JFrame; 
    import javax.swing.JPanel; 
    import javax.swing.event.AncestorEvent; 
    import javax.swing.event.AncestorListener; 
    
    public class CardlayoutTest extends JFrame { 
    
        private static final long serialVersionUID = 1L; 
        public CardLayout card = new CardLayout(); 
    
        public CardlayoutTest() { 
         EventHandler eventHandle = new EventHandler(); 
         JPanel pnlA = new JPanel(new BorderLayout()); 
         pnlA.add(new JButton("A"), BorderLayout.CENTER); 
         JPanel pnlB = new JPanel(new BorderLayout()); 
         pnlB.add(new JButton("B"), BorderLayout.CENTER); 
         pnlA.addAncestorListener(eventHandle); 
         pnlA.addHierarchyListener(eventHandle); 
         pnlB.addAncestorListener(eventHandle); 
         pnlB.addHierarchyListener(eventHandle); 
         setLayout(card); 
         add(pnlA, "A"); 
         add(pnlB, "B"); 
         setDefaultCloseOperation(EXIT_ON_CLOSE); 
        } 
    
        class EventHandler implements AncestorListener, HierarchyListener { 
    
         @Override 
         public void ancestorAdded(AncestorEvent event) { 
          System.out.println("CardlayoutTest.EventHandler.ancestorAdded()"); 
         } 
    
         @Override 
         public void ancestorMoved(AncestorEvent event) { 
          System.out.println("CardlayoutTest.EventHandler.ancestorMoved()"); 
         } 
    
         @Override 
         public void ancestorRemoved(AncestorEvent event) { 
          System.out.println("CardlayoutTest.EventHandler.ancestorRemoved()"); 
         } 
    
         @Override 
         public void hierarchyChanged(HierarchyEvent e) { 
          System.out.println("CardlayoutTest.EventHandler.hierarchyChanged()"); 
         } 
        } 
    
        public static void main(String[] args) { 
         CardlayoutTest t = new CardlayoutTest(); 
         t.setSize(500, 500); 
         System.out.println("CardlayoutTest.main()------------------------ FIRST"); 
         t.card.show(t.getContentPane(), "A"); 
         t.setVisible(true); 
         System.out.print("\n"); 
         try { 
          Thread.sleep(2000); 
         } catch (InterruptedException e) { 
         } 
         System.out.println("CardlayoutTest.main()------------------------ SECOND"); 
         t.card.show(t.getContentPane(), "B"); 
         System.out.print("\n"); 
         try { 
          Thread.sleep(2000); 
         } catch (InterruptedException e) { 
         } 
         System.out.println("CardlayoutTest.main()------------------------ THIRD"); 
         t.card.show(t.getContentPane(), "B"); 
         System.out.print("\n"); 
        } 
    } 
    
    +1

    이 질문에는 대답하지 않습니다. –

    3

    어떤 카드가 활성화되어 있는지 직접 알 수있는 방법이없는 것으로 보입니다. 내 생각 엔 실수가 아니라 디자인 결정이라는 것입니다. 활성 카드를 추적 할 책임은 귀하에게 있습니다.

    그러나 나는 왜 당신이 그것을 추적 할 필요가 있는지 알지 못합니다. 스윙은 이벤트를 기반으로하며 어떤 이벤트가 발생하면 어떤 카드가 활성 상태인지 거의 알 수 있습니다.

    0

    여기에서 선택한 대답은 CardLayout에 추가 된 첫 번째 구성 요소이며 사용자가 묻는 것으로 생각하지 않습니다.

    for(Component comp : cardPanel.getComponents()) { 
        if (comp.isVisible()) { 
         return (JPanel)comp; 
        } 
    } 
    

    Component getVisibleCard() { ... } 
    

    당신이 현재 표시되어있는 구성 요소를 얻을 수 있도록 해주는 구성 요소를 반환하는 방법이 퍼팅 :를 통해 CardLayout의 구성 요소를 반복하여 표시 패널을 찾을 수있는 간단한 방법이있다 .

    관련 문제