2013-02-19 1 views
0

그래서 2 개의 JPanel을 갖고 싶습니다. JPanel (introPanel) 및 JPanel (mainPanel) 아래로 Id는 JFrame에 keyListener를 추가하여 패널을 숨길 때 키를 눌렀을 때 패널을 볼 수 있습니다. 코드가 어떻게 작동해야합니까?다른 JPanel 위에 JPanel을 표시 한 다음 숨기는 방법

class MainFrame extends JFrame { 
    private MainPanel mainPanel = new MainPanel(); 
    private IntroPanel introPanel = new IntroPanel(); 

    MainFrame() { 
     add(mainPanel); 
     add(introPanel); 
     setResizable(false); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     addKeyListener(new KeyAdapter() { 
      @Override 
      public void keyReleased(KeyEvent ev) { 
       introPanel.setVisible(false); 
      } 
     }); 
     pack(); 
     setVisible(true); 
    } 

} 

이 코드는 introPanel을 숨기지 않습니다. 뭐가 문제 야?

+0

아마도 다시 그리기를해야합니다. visibile (false)로 설정해도 사라지지 않습니다. 다음 렌더링시 그리지 말라고 알려줍니다. – corsiKa

+0

repaint()를 호출 하시겠습니까? 나는 심지어 revalidate()를 호출했고 아무 일도 일어나지 않았다. – user2080377

+0

이것이 작동하지 않는 유일한 것인가? 다른 그래픽이 작동합니까? – corsiKa

답변

3

BorderLayout.CENTER 위치에 하나의 구성 요소 만 배치 할 수 있으므로 introPanel은 추가 할 때 mainPanel을 대체합니다.

add(mainPanel); 
revalidate(); 
repaint(); 

CardLayout 사용을 고려 : 당신이 표시하고자하는 경우 당신은 mainPanel을 추가해야합니다. 이 방식으로 "스태킹"구성 요소의 개념을 지원합니다.

Swing 기반 응용 프로그램에 Key Bindings도 사용하는 것이 좋습니다. KeyListeners과 달리 키 바인딩에는 KeyEvents과 상호 작용할 필요가 없습니다.

+0

하지만이 핵심 수신기가 작동합니다. 나는 줄을 추가했다 : "System.out.println ("a ");" 키를 누를 때마다 "a"가 인쇄됩니다. – user2080377

+0

@ user2080377 작은 변화를 만들 때 갑자기 작동을 멈추는 것으로 유명한 KeyListeners가 유명합니다. 그들이 등록한 구성 요소는 초점을 맞추고 작업에 집중해야합니다. Key Bindings는 훨씬 더 유연한 API이며 구성 요소에 키 이벤트를 첨부하는 데 권장되는 방법입니다 – MadProgrammer

+0

+! 좋은 대답. 나는 아직도 OP가 양쪽 패널을 하나의'JScrollPane'에 넣어야한다고 생각한다. 이 용도로 '디자인 된'것처럼 보입니다. –

관련 문제