2010-07-02 10 views
1

J'ai un programme principal qui appelle un JFrame pour obtenir des informations sur l'utilisateur, Si un utilisateur appuie sur soumettre je stocke les informations dans POJO et l'obtenir dans le programme principal.e.getWindow(). Dispose() ne fonctionne pas?

Si l'utilisateur clique sur Quitter, je souhaite disposer du JFrame et quitter le programme principal après avoir exécuté une instruction de journalisation dans la méthode principale.

Si j'utilise -

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
and 
this.addWindowListener(new WindowAdapter() { 
      public void windowClosed(WindowEvent e) { 
       e.getWindow().dispose(); 
      } 
     }); 

toute la sortie Threads immédiatement et je ne suis pas en mesure d'exécuter statments d'exploitation forestière dans la méthode principale.

Si j'utilisation-

this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
this.addWindowListener(new WindowAdapter() { 
      public void windowClosed(WindowEvent e) { 
       e.getWindow().dispose(); 
      } 
     }); 

Ma méthode principale d'exécuter les connecter statments mais jamais sortie, il reste silencieux après l'exécution de toutes les déclarations.

Si j'utilise cette -

this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
this.addWindowListener(new WindowAdapter() { 
      public void windowClosed(WindowEvent e) { 
       Thread.currentThread.interrupt(); 
      } 
     }); 

Tout fonctionne très bien. Mais est-ce la bonne façon de faire cela?

Répondre

0

La méthode Dispose libère uniquement les ressources système. Pour fermer effectivement la fenêtre, vous devez appeler

1

En théorie, si vous dispose toutes les fenêtres de niveau supérieur, la JVM doit se terminer proprement.

Cependant, il y a quelques détails pour vous assurer, qui sont détaillées sur this page:

Par conséquent, une demande AWT autonome qui souhaite quitter proprement sans appeler System.exit doit:

  • Assurez-vous que tous les composants AWT ou swing sont faites lorsque affichable les finitions d'application. Cela peut être effectué en appelant Window.dispose sur tous les postes de travail de niveau supérieur Windows . Voir Frame.getFrames.
  • Assurez-vous qu'aucune méthode d'écoute d'événements AWT enregistrée par l'application avec un composant AWT ou Swing ne peut être exécutée dans une boucle infinie ou se bloquer indéfiniment. Pour par exemple, une méthode d'écoute AWT déclenchée par un événement AWT peut publier un nouvel événement AWT du même type dans la file d'événements . L'argument est que méthodes d'auditeurs d'événements AWT sont généralement exécuté sur les threads auxiliaires.

Si vous ne parvenez pas à trouver ce qui maintient en vie le programme, il peut y avoir une autre façon:

-Utiliser la première méthode que vous avez décrit, avec le EXIT_ON_CLOSE
-Ajouter un ShutdownHook au runtime, pour exécuter vos dernières instructions de journalisation:

Runtime.getRuntime().addShutdownHook(new Thread() { 
    @Override 
    public void run() { 
     //logging statements 
    }); 
+0

merci, travaille pour moi – nachokk