Java Swing计时器只运行一次
谁能告诉我为什么这个计时器只运行一次
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class TimerTest implements ActionListener{
private Robot r;
private Timer t;
private int i;
public TimerTest(){
i = 0;
try {
r = new Robot();
} catch (AWTException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
t = new Timer(1000, this);
t.setRepeats(true);
t.start();
}
public static void main(String [] args){
new TimerTest();
}
@Override
public void actionPerformed(ActionEvent arg0) {
i++;
System.out.println("Action..." + i);
}
有趣的是,如果我将计时器中的延迟减少到只有100,它将按预期工作。更有趣的是,如果我删除初始化机器人的代码,它根本不工作,程序在我运行它时就终止了
我已经在Windows7和Ubuntu上试过了(虽然在Ubuntu上我根本不能使用机器人,因为我遇到了一个例外。可能是一些与权限相关的东西)
# 1 楼答案
请参见错误数据库中的"main exits before javax.swing.Timer's start() can start"
评估
当应用程序在Swing计时器启动之前退出时,所描述的行为是正确的。接下来的情况如下:
。。这看起来像RFE,而不是缺陷
使其正常运行的一个可靠方法是创建一个GUI元素并显示它。这就是我之前问的原因
为了处理这种情况,我通常会创建并显示一个框架,以允许用户配置屏幕截图的速率和面积,然后将该框架最小化,并在用户单击时开始处理:
屏幕截图
# 2 楼答案
你的main被处理,所以程序停止。可以使用以下代码对其进行测试,将其添加到TimerTest()中
JFrame会让你的main不会消失,当你关闭帧时,TimerTest就会结束。你的主菜就这样结束了,主菜就这样结束了。结束程序并停止摆动计时器