2016-06-02 3 views
0

사용자가 "N"문자를 입력하면 JFrame (JPanel 포함)을 교체하려고합니다.JFrame 제거/교체 하시겠습니까?

현재 코드는 새 JFrame을 추가하기 만하지만 이전 코드는 제거하지 않습니다. 여기

Frame.java 클래스 :

public class Frame extends JFrame { 
    public Frame() { 
     add(new Panel()); 
     pack(); 
    } 

    public static void main(String[] args) { 
     JFrame frame = new Frame(); 
     frame.setVisible(true); 
    } 
} 

그리고 여기 내 Panel.java 클래스입니다 : 당신이 정말로 JFrame의 교체하려면

public class Panel extends JPanel implements ActionListener { 

    public Panel() { 
     setPreferredSize(new Dimension(1000, 1000)); 
     setFocusable(true); 

     addKeyListener(new PanelKeyListener()); 
    } 

    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 

     // Paint things 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     repaint(); 
    } 

    class PanelKeyListener implements KeyListener { 

     @Override 
     public void keyPressed(KeyEvent e) { 
      int keyCode = e.getKeyCode(); 

      switch (keyCode) { 
       case KeyEvent.VK_N: 
        JFrame frame = new Frame(); 
        frame.setVisible(true); 
        break; 
      } 
     } 
    } 
} 
+0

를 사용하여 키 바인딩 API, KeyListener가 겪고있는 포커스 관련 문제를 해결합니다. 여러 프레임에 걸쳐 CardLayout 사용을 고려하십시오. – MadProgrammer

답변

0

, 당신은 새로운 하나를 열고 그것을 닫을 수 있습니다 :

frame.dispatchEvent(new WindowEvent(frame, WindowEvent.WINDOW_CLOSING)); 

또는하여 :

frame.setVisible(false); 
frame.dispose(); 

하지만 JFrame을 교체하는 것은 매우 이상합니다. 일반적으로, 우리는 내가 당신의 코드를 변경 할의 (setContentPanel 포함) 프레임의 내용이 아니라 프레임 자체 :)

frame.setContentPanel(new OtherPanel()) 

PERSONNALY을 변경 : 모든 KeyListener를 통해

public class Frame extends JFrame { 
    public static void main(String[] args) { 
     JFrame frame = new Frame(); 
     frame.setContentPane(new MyPanel(frame)); 
     frame.setVisible(true); 
    } 
} 

public class MyPanel extends JPanel implements ActionListener { 
    private Frame refFrame; 
    public MyPanel(Frame frame) { 
     this.refFrame = frame; 

     setPreferredSize(new Dimension(1000, 1000)); 
     setFocusable(true); 

     addKeyListener(new PanelKeyListener()); 
    } 

    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 

     // Paint things 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     repaint(); 
    } 

    class PanelKeyListener implements KeyListener { 

     @Override 
     public void keyPressed(KeyEvent e) { 
      int keyCode = e.getKeyCode(); 

      switch (keyCode) { 
       case KeyEvent.VK_N: 
        refFrame.setContentPane(new OtherPanel()); 
        break; 
      } 
     } 
    } 
} 
+0

이 코드는 어디에서 내 프로그램에 포함됩니까? 'main()'또는 keypress 안에? 또한 프레임의 내용이 정상적으로 변경되었다고 언급합니다. 그게 어떻게 끝날까요? – user6416322

+0

그렇게 할 수있는 방법이 많이 있습니다. 하나는 패널 생성자에서 JFrame에 대한 참조를 제공하는 것입니다. 이 참조는 필드에 저장됩니다. 그런 다음 키 수신기에서'''frameField.setContentPane (new CustomPanel())''을 호출 할 수 있습니다. (잠깐 기다려주세요.) –

+0

어떻게 참조할까요? 'Panel' 클래스 생성자의'Frame'? :/ – user6416322