Java Swing Timer只运行一次

时间:2012-01-16 19:40:25

标签: java swing timer

有谁能告诉我为什么这个计时器只运行一次?

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上我根本无法使用机器人,因为我得到了一个例外。可能与权利有关。)

2 个答案:

答案 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计时器启动之前退出时 - 是正确的。这是以下内容:

  1. 创建了Swing计时器。
  2. 启动摆动计时器的单独线程。它会在通过将InvocationEvent实例发布到EDT来传递超时时通知附加的actionListeners。
  3. 主线程退出。
  4. 目前在JVM中没有运行的非守护程序线程。申请被终止。
  5.   

    ..评估员继续添加..

    ..这看起来像是RFE而不是缺陷。


    使其成为行为的一种万无一失的方法是创建一个GUI元素并显示它。这就是我之前问过的原因..

      

    ..为什么要创建没有任何GUI元素的计时器?这是重复的屏幕截图吗?

    为了处理这种情况,我通常会创建并显示一个框架,以允许用户配置屏幕截图的速率和区域,然后 最小化 框架并开始处理当用户点击:

    屏幕截图!