7
votes

Attendez que JDialog ferme

J'ai une classe FilePathdialog qui prolonge JDialog et que la classe est appelée à partir de certains classes X. Voici une méthode de classe X

    projectDialog = new FilePathDialog();   
    projectDialog.setVisible(true);

    projectDialog.addWindowListener(new WindowAdapter() {            
        public void windowClosing(WindowEvent e) {
            System.out.println("Window closing");
            try {
                doWork();
            } catch (Throwable t) {
                t.printStackTrace();
            }                
        }

        public void windowClosed(WindowEvent e) {
            System.out.println("Window closed");
            try {
                doWork();
            } catch (Throwable t) {
                t.printStackTrace();
            }                
        }
    });     


3 commentaires

Avez-vous essayé d'ajouter l'auditeur avant de rendre la fenêtre visible?


Est-ce une boîte de dialogue modale? Si oui, vous n'ajoutez pas d'auditeur de fenêtre, surtout après que la boîte de dialogue est rendue visible. Au lieu de cela, la boîte de dialogue a été traitée lorsque la ligne après projectdialog.setVisible (true); est atteint.


Cela ne devrait pas avoir d'importance. Si une boîte de dialogue modale (ce qui vous convient), le code reprendra juste après l'utilisateur (vrai), il n'y aurait donc pas besoin d'un auditeur. Si une boîte de dialogue non modale, l'auditeur fonctionnera, peu importe quand il est ajouté.


3 Réponses :


18
votes

Encore une fois, la clé est est la boîte de dialogue modale ou non ?

Si c'est modal, il n'y a pas besoin d'un WindowListener, car vous saurez que la boîte de dialogue a été traitée puisque le code reprendra immédiatement sous votre appel à votre appel à SETVisible (true) sur la boîte de dialogue. c'est-à-dire que cela devrait fonctionner: xxx

Si, d'autre part, il est moins en mode, une liste de fenêtres doit fonctionner, et vous avez probablement eu un autre problème dans le code non montré ici. , et vous voudrez poster un SSCCE pour que nous analyses, exécuter et modifier.

Modifier pour GPECHE
Veuillez consulter ce SSCCE indiquant que les 3 types de paramètres de fermeture par défaut déclencheront l'écoute de la fenêtre: xxx


0 commentaires

3
votes

Javadoc pour windowlistener.windowflosed () :

invoqué lorsqu'une fenêtre a été fermée à la suite de l'appelant Dispose sur la fenêtre.

et pour JDialog.setDefaultCloseopération () :

Définit l'opération qui se passera par défaut lorsque l'utilisateur initie une "fermeture" sur cette boîte de dialogue. Les choix possibles sont:

  • do_nothing_on_close - Ne faites rien - besoin du programme de gérer l'opération dans la méthode de visualisation de fenêtre d'un objet WindowListener déposé.
  • hide_on_close - masque automatiquement la boîte de dialogue après avoir appelé tous les objets de liste de fenêtres enregistrés
  • Dispose_on_close - masquer automatiquement et Dispose la boîte de dialogue après avoir appelé tous les objets de fenêtre déposée

    La valeur est définie sur hide_on_close par défaut.

    qui suggère que vous devriez appeler projectdialog.setdefaultcloseoperation (windowConstants.dispose_on_close); après instanciation filepathdialog .


2 commentaires

Tous les types de fermeture par défaut répertoriés ci-dessus déclencheront des méthodes de clause de fenêtres ou d'une fenêtre ou à la fois dans le WindowListener. S'il vous plaît voir ma réponse pour un SSCCE qui démontre que c'est le cas.


@ Hovercraft plein d'anguilles Oh oui, je n'ai pas vu l'appel à Dowork () Intérieur WindowsClose ()



2
votes

Réponse à votre question

Ajouter WindowListener à votre jdialog ( jdialog.do_nothing_on_close ), sur windowclose événement pour essayer d'exécuter votre code, Si se termine par le succès, appelez jetez () ou SETVisible (FALSE)

Je n'ai pas accepté votre idée, une autre solution de contournement

Créer un seul jdialog (jdialog.do_nothing_on_close) avec windowlistener et réutiliser cela pour un autre action , l'action finale sera toujours SETVISIBLE (FALSE) , si votre code se termine par le succès, supprimez ensuite le (s) enfant (s) de JDialog , votre JDialog est préparé pour un autre travail


0 commentaires