2010-09-17 4 views
1

В моем приложении java swing есть Jframe и Jlabel для отображения текущего времени. Здесь я использую поток для отображения времени в jlablel, который добавляется в frame.my сомнение в том, что когда я удаляю jframe, что произойдет с потоком, будет ли он работать или останавливаться.java swing thread problem

+1

и в чем проблема? – Roman

+0

Свободная нить - проблема. – kgiannakakis

+0

@Roman память выпуск. – Lalchand

ответ

2

Если вы не отметили свою нить как демона, позвонив по номеру yourThread.setDaemon(true), он будет продолжать работать, даже если основной поток в вашем приложении завершен. Помните, что вам нужно позвонить setDaemon перед началом темы.

Обратитесь к моему answer в какой-либо предыдущий вопрос для деталей.

Правильный способ в вашем случае, я считаю, будет поддерживать флаг «стоп», который отслеживается вашим потоком таймера. Поток таймера должен выйти при чтении этого флага как «false». Вы можете добавить WindowListener к вашему JFrame и на закрытом окне событий установите флажок «стоп» в истинной

Heres пример кода для того, что я предлагаю:

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' вместо потока и вызывал' stop() 'на нем в моем методе windowClosing (WindowEvent e)'. – Qwerky

+1

+1 звучит интересно, я попробую. – Lalchand

0

Ваш поток будет продолжать работать.

Вам необходимо либо сделать так, как предложено Гопи, или вы можете использовать System.exit(0) в непосредственной близости от вашего JFrame.

ПРИМЕЧАНИЕ. Я предполагаю, что ваше приложение должно завершиться, если этот кадр закрыт.

+0

Нет, я не могу позвонить в system.exit (0), он закроет мое приложение. Мне нужно избавиться от jframe и показать новую jframe в течение нескольких секунд. – Lalchand