2010-09-17 133 views
1

在我的java swing應用程序中,我有一個用於顯示當前時間的Jframe和Jlabel。 這裏我正在使用一個線程來顯示時間在jlablel中被添加到frame.my的疑問是,當我處置jframe時,會發生什麼事情發生在線程無論它正在運行還是停止。java swing線程問題

+1

什麼是實際問題? – Roman 2010-09-17 10:00:17

+0

鬆散的線程是一個問題。 – kgiannakakis 2010-09-17 10:06:45

+0

@羅馬記憶問題。 – Lalchand 2010-09-17 10:11:35

回答

2

如果您還沒有通過調用yourThread.setDaemon(true)標記您的主題守護程序,它會繼續運行,即使在您的應用程序的主線程完成。請記住,在開始線程之前,您必須致電setDaemon

請參閱我的answer對於一些細節上的前一個問題。

在你的情況下正確的方法,我相信會是你保持這是由你的計時器線程觀看了「停止」標誌。讀取此標誌時,定時器線程應退出爲'假'。您可以將的WindowListener添加到您的JFrame,並在窗口關閉事件設置「停止」標誌真正

繼承人的示例代碼我的建議:

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

我會更進一步,使用'javax.swing.Timer'而不是線程,並在'windowClosing(WindowEvent e)'方法中調用'stop()'。 – Qwerky 2010-09-17 10:29:57

+1

+1聽起來很有趣,我會嘗試。 – Lalchand 2010-09-17 10:36:21

0

你的線程將繼續運行。

你需要做的要麼通過戈皮的建議或者你可以在你的JFrame的關閉操作使用System.exit(0)

注意:我這裏假設你的應用程序需要結束,如果這幀被關閉。

+0

不,我不能調用system.exit(0)它會關閉我的應用程序。我需要處理jframe並在幾秒鐘內顯示一個新的jframe。 – Lalchand 2010-09-17 10:33:44