有谁能告诉我为什么这个计时器只运行一次?
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);
}
有趣的是,如果我将Timer中的延迟减少到100,它会按预期工作。更有趣的是,如果我删除了初始化Robot的代码,它根本不起作用,程序会在我运行它时立即终止。
我在Windows 7和Ubuntu上尝试了这个(虽然在Ubuntu上我根本无法使用机器人,因为我得到了一个例外。可能与权利有关。)
答案 0 :(得分:5)
你的主要处理,所以程序停止。您可以使用此代码对其进行测试,并将其添加到TimerTest()
JFrame testFrame = new JFrame();
testFrame.setVisible(true);
testFrame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
当你关闭FrameTestTestTest结束时,JFrame可以保持你的主要不被finshing。哪个结论你的主要导致主要finsh。结束程序并停止挥杆计时器。
答案 1 :(得分:2)
请参阅错误数据库中的"main exits before javax.swing.Timer's start() can start"。
描述的行为 - 当应用程序在Swing计时器启动之前退出时 - 是正确的。这是以下内容:
..评估员继续添加..
..这看起来像是RFE而不是缺陷。
使其成为行为的一种万无一失的方法是创建一个GUI元素并显示它。这就是我之前问过的原因..
..为什么要创建没有任何GUI元素的计时器?这是重复的屏幕截图吗?
为了处理这种情况,我通常会创建并显示一个框架,以允许用户配置屏幕截图的速率和区域,然后 最小化 框架并开始处理当用户点击:
屏幕截图!