Ich möchte einen Button (JButton) am unteren Rand eines JDialogs hinzufügen, der den JDialog schließen soll, wenn er gedrückt wird. Das Problem ist, ich weiß nicht, was ich in den ActionListener dieser Schaltfläche schreiben soll. Ich möchte nicht, dass die Schaltfläche das Programm verlässt. Schließen Sie einfach den Dialog.
Der JDialog wird erstellt, indem ein Konstruktor von JDialog explizit aufgerufen wird, nicht eine der Methoden von JOptionPane.
Ich war extrem überrascht, dass ich mit Google keine Antwort darauf finden konnte. Ich habe erwartet, dass ein Problem, das so oft angesprochen wird, auf vielen Programmierseiten umfassend behandelt wird. Ziemlich komisch, dass es nicht so ist.
import Java.awt.event.*;
import javax.swing.*;
public class YourDialog extends JDialog implements ActionListener {
JButton button;
public YourDialog() {
button = new JButton("Close");
button.addActionListener(this);
add(button);
pack();
setVisible(true);
}
public void actionPerformed(ActionEvent e) {
dispose();
}
}
schließen Sie nur Dialolg mit der dispose()
-Methode. Der übergeordnete Frame ist nicht geschlossen. Grund dafür, dass JVM nicht beendet wurde.
Sie können mit der ActionListener
einen WindowEvent.WINDOW_CLOSING
absenden, wie in hier gezeigt.
In der actionPerformed()
-Methode von ActionListener
möchten Sie etwa Folgendes:
dialog.setVisible(false);
Wenn Sie den Dialog dauerhaft loswerden möchten (aus dem Speicher freigeben), würden Sie also aufrufen:
dialog.dispose();
... wobei Dialog der Name Ihres Dialogs ist. Wenn dialog
eine lokale Variable ist, müssen Sie sie als final definieren, um auf diese Weise darauf zugreifen zu können (oder stellen Sie sicher, dass sie ab Java 8 "effektiv final" ist).
Wenn Sie die Schaltfläche als Teil einer Unterklasse von JDialog hinzufügen (d. H., Sie haben class MyDialog extends JDialog
und den Aktionslistener in MyDialog
), benötigen Sie Folgendes:
MyDialog.this.setVisible(false);
Ich habe das etwas anders gemacht und es dient dem Zweck. Ich habe mehrere Klassen. Sie erweitern JPanel, dienen verschiedenen Zwecken und verwenden JDialogs, um Benutzereingaben zu erhalten.
Eine typische Klasse würde notwendige Felder sowie Schaltflächen zum Speichern und Abbrechen enthalten.
die öffentliche Klasse EnterpriseGUI erweitert javax.swing.JPanel {...} würde folgendermaßen aussehen:
Die Klasse EnterpriseGUI verfügt über eine private Variable jdialog und eine Methode zum Festlegen von jdialog. Auch ActionEvent für die Schaltflächen "Speichern" und "Abbrechen".
private JDialog jdialog;
public void setJDialog(JDialog jdialog)
{
this.jdialog = jdialog;
}
private void btnSaveActionPerformed(Java.awt.event.ActionEvent evt) {
//Do your stuff..
jdialog.dispose();
}
private void btnCancelActionPerformed(Java.awt.event.ActionEvent evt) {
//Discard your stuff..
jdialog.dispose();
}
Schließlich erstelle ich eine Instanz von EnterpriseGUI aus einer beliebigen anderen Klasse und baue sie in JDialog ein.
Class OtherClass{
private JDialog dialog;
private EnterpriseGUI = new enterprisegui();
private void button1ActionPerformed(Java.awt.event.ActionEvent evt) {
this.dialog = new JDialog(this, "My dialog", true);
this.dialog.setResizable(false);
enterprisegui.setJDialog(dialog);
this.dialog.getContentPane().add(enterprisegui);
this.dialog.pack();
Dimension Size = Toolkit.getDefaultToolkit().getScreenSize();
this.dialog.setLocation(new Double((Size.getWidth()/2) -
(dialog.getWidth()/2)).intValue(), new Double((Size.getHeight()/2) -
(dialog.getHeight()/2)).intValue());
this.dialog.setVisible(true);
}
}
Neben anderen Antworten können Sie diese als Standardschaltfläche für den Stammbereich des Dialogfelds festlegen:
JButton myButton = new JButton("Close");
myButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
dispose(); // Or whatever else
setVisible(false);
}
});
getRootPane().setDefaultButton(myButton);
Auf diese Weise wird ActionListener
immer aufgerufen Enter wird gedrückt.