web-dev-qa-db-fra.com

Bouton de fermeture d'un JDialog

Je veux ajouter un bouton (JButton) au bas d'un JDialog qui devrait fermer le JDialog lorsque vous appuyez dessus. Le problème est que je ne sais pas quoi écrire dans le ActionListener de ce bouton. Je ne veux pas que le bouton quitte le programme, ferme simplement la boîte de dialogue.

JDialog est créé en appelant explicitement l'un des constructeurs de JDialog, et non en appelant l'une des méthodes à partir de JOptionPane.

J'ai été extrêmement surpris de ne pouvoir trouver de réponse à cette question à l'aide de Google. Je m'attendais à ce qu'un problème si souvent rencontré soit largement couvert par de nombreux sites de programmation. Assez bizarre que ce ne soit pas.

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();
  }
}
  • ne ferme que dialolg en utilisant la méthode dispose(), le cadre parent n'est pas fermé raison pour laquelle la machine virtuelle Java n'est pas terminée.

36
Mohammed Aslam

Vous pouvez faire en sorte que ActionListener envoie un WindowEvent.WINDOW_CLOSING, comme indiqué ici .

7
trashgod

Dans la méthode actionPerformed() de ActionListener, vous voulez quelque chose comme:

dialog.setVisible(false);

Si vous voulez vous débarrasser définitivement du dialogue (le libérer de la mémoire), alors vous voudriez aussi appeler:

dialog.dispose(); 

... où dialogue est le nom de votre dialogue. Si dialog est une variable locale, vous devrez la rendre finale pour y accéder de cette manière (ou assurez-vous simplement qu'elle est "effectivement finale" à partir de Java 8).

Si vous ajoutez le bouton dans une sous-classe de JDialog (c'est-à-dire si vous avez class MyDialog extends JDialog et ajoutez l'écouteur d'actions dans MyDialog), vous souhaiterez:

MyDialog.this.setVisible(false);
6
Michael Berry

Je l'ai fait légèrement différemment et cela sert à cela. J'ai plusieurs cours. Ils étendent JPanel, servent différents objectifs et utilisent JDialogs pour obtenir les entrées des utilisateurs. 

Une classe typique contiendrait les champs nécessaires, les boutons de sauvegarde et d’annulation.

la classe publique EnterpriseGUI extend javax.swing.JPanel {...} ressemblerait à ceci:

 JPanel class in designer mode

La classe EnterpriseGUI a une variable privée jdialog et une méthode pour définir jdialog. ActionEvent pour les boutons 'save' et 'cancel'.

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

Enfin, je crée une instance d'EnterpriseGUI à partir de n'importe quelle autre classe et l'intègre dans JDialog.

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

Outre d'autres réponses, vous pouvez le définir comme bouton par défaut pour le volet racine de la boîte de dialogue:

JButton myButton = new JButton("Close");
myButton.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        dispose(); // Or whatever else
        setVisible(false);
    }
});
getRootPane().setDefaultButton(myButton);

De cette façon, son ActionListener sera appelé à chaque fois Enter est pressé.

0
Matthieu