web-dev-qa-db-de.com

Schaltfläche zum Schließen eines JDialogs

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.

18
SoboLAN
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.

36
Mohammed Aslam

Sie können mit der ActionListener einen WindowEvent.WINDOW_CLOSING absenden, wie in hier gezeigt.

7
trashgod

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);
6
Michael Berry

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:

 JPanel class in designer mode

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);

    }  
}
0
Gaurang

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 ActionListenerimmer aufgerufen Enter wird gedrückt.

0
Matthieu