2016-06-02 44 views
0

Ich möchte einen JFrame (der eine JPanel enthält) ersetzen, wenn der Benutzer den Buchstaben "N" eingibt.JFrame-Fenster entfernen/ersetzen?

Mein aktueller Code fügt nur einen neuen JFrame hinzu, aber entfernt nicht den vorherigen.

Hier ist meine Frame.java Klasse:

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

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

Und hier ist meine Panel.java Klasse:

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

Verwenden Sie die Tastenbelegungen API über KeyListener, Es löst die Fokusprobleme, unter denen KeyListener leidet. Erwägen Sie, CardLayout über mehrere Frames hinweg zu verwenden. – MadProgrammer

Antwort

0

Wenn Sie wirklich das JFrame ersetzen möchten, können Sie ein neues öffnen und schließen Sie es mit :

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

Oder von:

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

Aber es ist sehr seltsam, einen JFrame zu ersetzen. Normalerweise wir den Inhalt des Rahmens ändern (mit setContentPanel) und nicht der Rahmen selbst :)

frame.setContentPanel(new OtherPanel()) 

personnaly, würde ich Ihren Code ändern:

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

Wohin würde dieser Code in meinem Programm gehen? Innerhalb von 'main()' oder im Tastendruck? Außerdem erwähnen Sie, dass normalerweise der Inhalt des Rahmens geändert wird. Wie wäre das zu machen? – user6416322

+0

Es gibt viele verschiedene Möglichkeiten, dies zu tun. Eine sollte sein, einen Verweis auf den JFrame im Konstruktor des Panels zu geben. Diese Referenz wird in einem Feld gespeichert. Dann können Sie in Ihrem Key-Listener '' 'frameField.setContentPane (new CustomPanel())' '' (Ich werde ein Beispiel Code-Snippet zu meiner Antwort hinzufügen, nur eine Minute warten;)) –

+0

Wie würde ich verweisen 'Frame' im Klassenkonstruktor' Panel'? :/ – user6416322