2016-05-26 10 views
0

Ich bin etwas neu zu Java-Programmierung, so mit mir hier. Wie auch immer, ich habe ein Jframe-Objekt in einer Klasse und ich möchte in der Lage sein, den Frame aus meiner Jpanel-Klasse zu schließen (die ich natürlich an den Rahmen anhefte). Wie auch immer, ich habe versucht, ein Instanz-Feld in meinem jpanel mit dem jframe-Objekt zu erstellen und dann eine Methode, die ich in der jframe-Klasse mit dem Parameter des jframe-Objekts aufrufen würde, um das jpanel-Instanz-Feld zu machen das gleiche Objekt wie das Jframe-Objekt. Ich rief dann die Instanz field.dispose(); Ich hoffe, es würde den Rahmen schließen. Irgendwelche Ideen würden sehr geschätzt werden!Mein Jframe wird nicht entsorgen

Im Falle, dass hier zu verstehen war schwer zu ein Beispiel:

public class example extends jFrame 
{ 
public static void main(String[]args) 
{ 
    examplePanel ep = new examplePanel(); 
    example e = new example(ep); 

} 
/** 
* Constructor for objects of class example 
*/ 
public example(examplePanel ep) 
{ 
    //code that handles my frame settings 
} 
} 

    public class examplePanel extends jPanel implements ActionListener 
    { 
    private example e; 
    private boolean checkWin; 
    public void actionPerformed(ActionEvent e) 
    { 
    if(this.checkWin()) 
    { 
     setVisible(false); 
     e.dispose(); 
     //^this line of code is supposed to dispose of the frame but it does not 
    } 
    } 

    public void getExample(example e) 
    { 
    this.e = e; 
    } 

    } 

Antwort

4

Ihr Code und Fragen sind schwer zu folgen, wie Sie eine Action haben, das Sie ohne JButton oder JMenuItem hinzufügen, Sie erstellen ein JFrame-Objekt und ein JPanel, aber werden nie beobachtet, um das Panel zu dem Rahmen hinzuzufügen. Sie geben Ihrem JPanel eine "Beispiel" -Variable, weisen ihm aber nie einen Verweis auf den visualisierten JFrame zu, Sie scheinen niemals die Standard-Schließoperation des JFrames einzustellen, und daher sollte Ihr JFrame wie oben beschrieben nicht schließbar sein. Aus Ihrem Code sieht es so aus, als würde die e Variable Ihres BeispielsPanels im JPanel eigentlich null sein. Daher sollte das Aufrufen einer beliebigen Methode eine NullPointerException auslösen, das heißt, es sei denn, Sie weisen dem Objekt den korrekten JFrame-Verweis zu, zeigen es aber nicht an .

Myself, würde ich das Top-Level-Fenster von Swing selbst erhalten, wenn nötig, so etwas wie:

 @Override 
     public void actionPerformed(ActionEvent e) { 
      // get the top-level window that is displaying this JPanel 
      Window win = SwingUtilities.getWindowAncestor(this); 
      if (win != null) { 
       win.dispose(); // dispose of it 
      } 
     } 

Zum Beispiel:

import java.awt.Dimension; 
import java.awt.Window; 
import java.awt.event.*; 
import javax.swing.*; 

public class CloseFromJPanel extends JPanel implements ActionListener { 
    private static final int PREF_W = 400; 
    private static final int PREF_H = 300; 

    public CloseFromJPanel() { 
     JButton closeButton = new JButton("Close Me"); 
     closeButton.addActionListener(this); 

     add(closeButton); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     // get the top-level window that is displaying this JPanel 
     Window win = SwingUtilities.getWindowAncestor(this); 
     if (win != null) { 
      win.dispose(); // dispose of it 
     } 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     if (isPreferredSizeSet()) { 
      return super.getPreferredSize(); 
     } 
     return new Dimension(PREF_W, PREF_H); 
    } 

    private static void createAndShowGui() { 
     JFrame frame = new JFrame("Close From JPanel"); 

     // GUI will exit when the JFrame is closed 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(new CloseFromJPanel()); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> createAndShowGui()); 
    } 

} 

Dieser Code wird für JButtons innerhalb JFrames arbeiten und JDialogs , aber nicht JMenuItems oder innerhalb von JAApplets (glaube ich nicht). Oder wenn Sie nur die Anwendung beenden möchten, können Sie einfach System.exit(0) innerhalb der actionPerformed-Methode aufrufen. Wenn Sie dies unbedingt mit einem Feld des JFrame tun möchten, müssen Sie einen Verweis auf den JFrame in JPanel übergeben, wahrscheinlich unter Verwendung eines Konstruktorparameters, und möglicherweise this übergeben.

Wenn dies nicht hilft, bitte erstellen und posten echten Code, keine Art von Code, den wir kompilieren, ausführen und testen können, eine MCVE (bitte überprüfen Sie den Link).

Weitere Themen:

  • Ihr Code entspricht nicht Java-Standards als Klassennamen zu benennen sollten alle mit Großbuchstaben beginnen. Bitte googlen Sie dies und studieren Sie es, denn wenn Ihr Code den Standards entspricht, werden andere, einschließlich uns und Ihrem zukünftigen Selbst, besser in der Lage sein, Ihren Code zu verstehen.
  • Sie werden selten jemals von JFrame ausdehnen wollen, da Sie selten das angeborene Verhalten ändern müssen. Normalerweise erstellen und verwenden Sie einen JFrame oder JDialog wann und wo nötig.