java swing线程问题

时间:2010-09-17 09:57:39

标签: java multithreading swing jframe

在我的java swing应用程序中,我有一个Jframe和Jlabel来显示当前时间。 这里使用一个线程来显示jlablel中添加到frame中的时间。我怀疑当我处理jframe时,无论是运行还是停止,都会发生什么。

2 个答案:

答案 0 :(得分:2)

如果您未通过调用yourThread.setDaemon(true)将线程标记为守护程序,即使应用程序中的主线程已完成,它也将继续运行。请记住,您必须在开始主题之前调用setDaemon

有关详细信息,请参阅我之前的answer一些问题。

我认为,在您的情况下,正确的方法是保持一个“停止”标志,由您的计时器线程监视。读取此标志时,定时器线程应退出为'false'。您可以向您的jframe添加一个WindowListener,并在关闭窗口的事件中将'stop'标志设置为 true

以下是我建议的示例代码:

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;
  }
}

答案 1 :(得分:0)

你的线程将继续运行。

您需要按照Gopi的建议执行操作,或者在JFrame的近距离操作中使用System.exit(0)

注意:我假设您的应用程序需要在此框架关闭时结束。