Rom*_*man 3 java swing timer jframe
这是代码:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.Timer;
public class TimerSample {
public static void main(String args[]) {
new JFrame().setVisible(true);
ActionListener actionListener = new ActionListener() {
public void actionPerformed(ActionEvent actionEvent) {
System.out.println("Hello World Timer");
}
};
Timer timer = new Timer(500, actionListener);
timer.start();
}
}
Run Code Online (Sandbox Code Playgroud)
它会生成一个窗口,然后在终端(命令提示符)中定期打印"Hello World Timer".如果我对此行new JFrame().setVisible(true);进行注释,则应用程序不会向命令行打印任何内容.为什么?
添加:
我不确定我是否正确理解答案.据我所知,计时器启动一个新线程.并且这个新线程与"主"线程同时存在.当"主"线程完成时(当一切都完成并且没有任何事情可做)时,整个应用程序终止(与定时器创建的"新"线程一起).是正确的?
增加2:
上述说明仍然没有解释所有内容.例如,如果我评论new JFrame().setVisible(true);并放在try {Thread.sleep(20000);} catch(InterruptedException e) {};后面,该程序是有效的timer.start().所以,我有点理解.使用sleep,我们保持"main"线程忙,这样定时器创建的线程就可以存在.但new JFrame().setVisible(true);不要占据"主力".据我所知,它创建了自己的线程(如Timer).那么,为什么JFrame的线程可以在没有主线程和定时器线程的情况下存在呢?
你错过了这一点.Timer与您创建的窗口无关,当您注释掉该窗口创建行时,它也可以工作.
但是,您未能看到的是:您的主程序退出之后timer.start(),因此,您的程序执行被终止,随之而来的是计时器.
如果Thread.sleep(20000);最后添加(包括所需的异常处理)或需要一些时间的任何其他代码,您可以验证这一点.然后你的计时器工作正常,即使没有创建任何窗口.
关键是即使没有显示任何内容,JFrame仍然处于活动状态,这反过来会使您的计时器保持活动状态.
| 归档时间: |
|
| 查看次数: |
965 次 |
| 最近记录: |