2010-12-15 6 views
4

방금 ​​스윙을 시작했습니다.이 질문을하기가 어렵다면 미안하지만 아주 간단한 것 같지만 스윙에서는 의외로 힘들 것 같습니다.Swing의 패널 및 데이터 전달하기

두 개의 텍스트 입력란과 제출 버튼이있는 패널이 있습니다.

제출 버튼에 수신기를 추가했습니다. 클릭 할 때 데이터 등의 유효성을 검사합니다.

이제 프레임에 새 패널을 표시하고 텍스트 필드와 제출 버튼으로 현재 패널을 제거하고 텍스트 필드에 입력 된 데이터를 기반으로 새 패널을 인스턴스화합니다.

이 데이터를 프레임으로 다시 보낼 수 있으므로 프레임이 현재 패널을 제거하고 첫 번째 패널의 데이터로 만든 새 다른 패널로 바꿀 수 있습니다.

내가하는 일이 아니지만 로그인과 같이 생각할 수 있습니다. 검증 경우

디스플레이 로그인 패널 패널은 사용자 이름과 암호를 가져, 유효성 실제 콘텐츠 패널

이 스윙에 알아낼 의외로 어렵다 로그인 패널을 교체 을 (검증도까지 더 할 수있다). 내 자신의 이벤트 유형을 정의하고 해당 이벤트에 대한 프레임을 리스너로 만들어야합니까?

답변

1

귀하의 질문을 이해한다면이 같은 콜백 논리를 사용할 수 있습니다. 생성자 public MyLoginPanel(IMyCallback callback)

  • IMyCallback와 JPanel의 연장

    MyLoginPanel login = new MyLoginPanel(new IMyCallback(){ 
    
          public void processLogin(){ 
           //frame can remove the current panel and replace it with a new 
          } 
    
         }); 
    
    • MyLoginPanel 방법은 public void processLogin()되어있는 인터페이스이다.

    당신은 당신을 위해 작동합니까

    LoginPanel

    에서 callback.processLogin();를 부를 수 ?

  • 1

    java.awt.CardLayout을 확인해야합니다. 이 레이아웃은 서로 쌓인 여러 개의 패널을 처리 할 수 ​​있습니다. 그리고 어떤 패널을 최상위에 표시 할 것인지 선택할 수 있습니다.

    다음 코드는 튜토리얼에서와 관계있는 부분은 위에서 언급 보여줍니다

    //Where instance variables are declared: 
    final static String BUTTONPANEL = "Card with JButtons"; 
    final static String TEXTPANEL = "Card with JTextField"; 
    
    
    //Where the components controlled by the CardLayout are initialized: 
    //Create the "cards". 
    JPanel card1 = new JPanel(); 
    JPanel card2 = new JPanel(); 
    
    //Create the panel that contains the "cards". 
    JPanel cards = new JPanel(new CardLayout()); 
    cards.add(card1, BUTTONPANEL); 
    cards.add(card2, TEXTPANEL); 
    

    및 가시 패널 전환 : 카드 사이

    CardLayout cl = (CardLayout)(cards.getLayout()); 
    cl.show(cards, TEXTPANEL); 
    
    +0

    그러나 당신은 어떻게 통과 할 데이터를? 한 패널에서 버튼을 클릭했다고 가정 해 봅시다. 이제 첫 번째 패널에서부터 빛나는 데이터가있는 다른 패널 (카드)을 표시하고 싶습니다. 그 점에 대해 어떻게 논리를 적용합니까? card1의 버튼을 클릭하면 '좋아, 이제 전환합니다.'라고 말하는 좋은 방법 (예 : 레이아웃 또는 상위 프레임 참조로 돌아 가지 않도록하는 방법)이 표시되지 않습니다. 부모 패널/프레임/액션 리스너 (다시 말하면, 당신이 ref를 전달할 것을 요구한다) 또는 레이아웃상의 첫 번째 패널 콜 쇼 (otherCard)를 가져야한다. (2 레벨에서 틀리게 보인다) – Cantor

    +0

    데이터에 대한 참조를 상위 프레임에 전달하지 않으려면 PropertyChangeSupport 및 PropertyChangeListener를 살펴보십시오.JPanel에는 이미 PropertyChangeSupport가 있으므로 재사용 할 수 있습니다. card1에 데이터를 설정하면 PropertyChange를 시작합니다. card2가 card1의 PropertyChanges (예 : card1.addPropertyChangeListener (card2))를 수신하게합니다. 그런 다음 card2에서 propertyChanged (PropertyChangeEvent evt)를 대체하여 card1에서 전송 된 데이터를 처리합니다. – Kintaro

    +0

    이 방법을 사용하여 패널을 전환 할 수도 있습니다. card1은 "switch"메시지로 PropertyChangeEvent를 시작할 수 있습니다. 상위 패널은 card1을 청취하고 메시지에 따라 패널을 전환합니다. – Kintaro