2010-06-25 9 views
1

Préface: Ceci est le premier vrai programme de swing que j'ai fait.java swing programme ne se ferme pas après que disposer est appelé sur la dernière fenêtre

J'ai un programme de swing, où un JButton est censé quitter le programme. Ce bouton déclenche this.dispose() ;. Lorsque je clique sur ce JButton, fait faire disparaître complètement la fenêtre, mais en regardant le débogueur, le programme lui-même est toujours en cours d'exécution.

Ma principale méthode consiste seulement:

public static void main (String[] args) 
{ 
    java.awt.EventQueue.invokeLater(new Runnable() 
    { 
    public void run() 
    { 
     new StartupGui().setVisible(true); 
    } 
    }); 
} 

Mon bouton de sortie ressemble bouton d'action ressemble à:

private void exitButtonActionPerformed(java.awt.event.ActionEvent evt) 
{ 
    this.dispose(); 
} 

J'ai aussi essayé le bouton de sortie:

private void exitButtonActionPerformed(java.awt.event.ActionEvent evt) 
{ 
    java.awt.EventQueue.invokeLater(new Runnable() 
    { 
    public void run() 
    { 
     dispose(); 
    } 
    }); 
} 

En regardant le débogueur après avoir appuyé sur le bouton de sortie, je vois ce qui suit (et seulement ce qui suit):

Daemon Thread [AWT-XAWT] (running) 
Thread [AWT-Shutdown] (running) 
Thread [AWT-EventQueue-0] (running) 
Thread [DestroyJavaVM] (running) 

Quelqu'un peut-il m'indiquer dans la bonne direction pourquoi le programme ne s'arrête pas après ce point? J'ai fait quelques recherches mais je n'ai rien trouvé jusqu'ici. Si vous avez besoin de plus d'informations, laissez-moi savoir

Merci :)

+0

quelle version de jdk utilisez-vous?les anciennes versions ne s'arrêtent pas lorsque toutes les fenêtres sont éliminées. – mdma

+0

$ java -version donne "build 1.6.0_20-b02". Je cours ceci sur une machine Arch Linux 64 bits. – vimalloc

Répondre

4

Parce que dispose() a rencontré Hod libère seulement les ressources.

Le doc a un

Note: Lorsque la dernière fenêtre affichable dans la machine virtuelle Java (VM) est éliminé, la machine virtuelle peut fin. Voir AWT Threading Issues pour plus d'informations.

Avez-vous remarqué que peut?

Le lien ci-dessus vous donne des informations détaillées sur la fonction d'arrêt automatique . Vous pouvez en lire plus à ce sujet, ou vous pouvez simplement résoudre ce problème en remplaçant this.dispose() par System.exit(0)

0

Cet article Repousser Pixels: AWT shutdown and daemon threads allons examiner le comportement d'arrêt de AWT qui a été changé en 1.4. Pourtant, l'article note qu'il peut être difficile d'obtenir un arrêt propre.

Sans y voir le reste du code, je ne peux offrir des pointeurs:

  • assurer qu'il n'y a pas d'autres cadres cachés qui ne sont pas disposés
  • Vérifiez qu'aucun message sont générés sur la file d'attente AWT (à-dire définir un point d'arrêt dans le EventQueue.)
  • regarder autrement au niveau du cadre de pile pour ces fils et de voir ce qu'ils sont occupés à faire