2010-09-17 5 views
1

Dans mon java swing application j'ai un Jframe et Jlabel pour afficher l'heure actuelle. ici j'utilise un fil pour l'affichage de l'heure dans jlablel qui est ajouté à la frame.mon doute est que lorsque je dispose de la jframe ce qui va arriver au thread si elle est en cours d'exécution ou arrêté.problème java swing thread

+1

et quel est le problème réel? – Roman

+0

Un thread lâche est un problème. – kgiannakakis

+0

Problème de mémoire @Roman. – Lalchand

Répondre

2

Si vous n'avez pas marqué votre thread en tant que démon en appelant yourThread.setDaemon(true), il continuera à fonctionner même si le thread principal de votre application est terminé. Rappelez-vous que vous devez appeler setDaemon avant de démarrer le fil.

Référez-moi à answer pour une question précédente pour plus de détails.

La manière correcte dans votre cas, je crois, serait que vous mainteniez un drapeau 'stop' qui est regardé par votre thread minuteur. Le fil de la minuterie doit quitter en lisant ce drapeau comme 'faux'. Vous pouvez ajouter un WindowListener à votre JFrame et la fenêtre événement ensemble fermé le drapeau « stop » à vrai

exemple de code Heres pour ce que je veux dire:

import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 

import javax.swing.JFrame; 

public class JFrameTest { 

    public static void main(String[] args) { 

    final Timer t = new Timer(); 
    t.start(); 

    JFrame jf = new JFrame("GOPI"); 
    jf.setVisible(true); 
    jf.setSize(100, 100); 
    jf.addWindowListener(new WindowAdapter() { 
     @Override 
     public void windowClosing(WindowEvent e) { 
     t.stopTimer(); 
     } 
    }); 
    System.out.println("JFrameTest.main() DONE"); 
    } 
} 

class Timer extends Thread { 
    boolean stop = false; 

    @Override 
    public void run() { 
    for (int i = 0; i < 50; i++) { 
     try { 
     Thread.sleep(1000); 
     } catch (InterruptedException e) { 
     e.printStackTrace(); 
     } 
     if (stop) 
     break; 
     System.out.println("Counting :" + i); 
    } 
    System.out.println("Timer exit"); 
    } 

    public void stopTimer() { 
    stop = true; 
    } 
} 
+0

Je voudrais aller plus loin et utiliser un 'javax.swing.Timer' au lieu d'un thread et appeler' stop() 'dans ma méthode' windowClosing (WindowEvent e) '. – Qwerky

+1

+1 semble intéressant, je vais essayer. – Lalchand

0

Votre thread continuera à fonctionner.

Vous devez soit faire comme suggéré par Gopi ou vous pouvez utiliser System.exit(0) en étroite opération de votre JFrame.

REMARQUE: Je suppose ici que votre application doit se terminer si ce cadre est fermé.

+0

non je ne peux pas appeler le system.exit (0) il fermera mon application. J'ai besoin de disposer de la jframe et montrer une nouvelle jframe en une fraction de seconde. – Lalchand