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.