【问题标题】:Java Swing Timer only runs onceJava Swing Timer 只运行一次
【发布时间】:2012-02-11 17:03:51
【问题描述】:

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

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,它会按预期工作。更有趣的是,如果我删除初始化机器人的代码,它根本不起作用,程序一运行就终止。

我已经在 Windows 7 和 Ubuntu 上尝试过这个(尽管在 Ubuntu 上我根本无法使用机器人,因为我遇到了一个异常。可能与权利有关)。

【问题讨论】:

  • Robot 的内容是什么?
  • 现在就是这样。我只是在测试 Robot 类,但我注意到了这一点,并将其剥离到最本质的部分以演示这个问题。程序中没有其他内容。
  • 我已经有一段时间没有使用 java Timer 了。主要完成时计时器会死吗?我知道普通线程不在java中,但我不记得定时器。如果是这种情况,您只需要添加一段时间 (t.isRunning());到主函数编辑:再看一遍,你必须为你创建的 TimerTest 的实例设置一个变量,并检查它的定时器是否仍在循环中运行,或者只是在 main if 中创建一个无限循环适合你想要的。
  • 请阅读this
  • 顺便说一句,您为什么要创建没有任何 GUI 元素的计时器?这是重复的屏幕截图吗?

标签: java swing timer


【解决方案1】:

您的 main 已处理,因此程序停止。您可以使用此代码对其进行测试,将其添加到 TimerTest()

JFrame testFrame = new JFrame();
testFrame.setVisible(true);
testFrame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );

当您关闭 Frame 时,TimerTest 结束时,JFrame 使您的 main 无法完成。这结束了你的主要导致主要完成。结束程序并停止挥杆计时器。

【讨论】:

  • 谢谢,事实证明这对理解为什么会发生这种情况很有帮助。所以,Timer 使用了一个守护线程,但这并不能阻止应用程序终止,对吧?
【解决方案2】:

请参阅错误数据库中的"main exits before javax.swing.Timer's start() can start"


评估

描述的行为 - 当应用程序在 Swing 计时器启动之前退出时 - 是正确的。接下来是这样的:

  1. 摆动计时器已创建。
  2. 摆动计时器的单独线程已启动。当超时通过时,它将通过将 InvocationEvent 实例发布到 EDT 来通知附加的 actionListener。
  3. 主线程退出。
  4. 此时在 JVM 中没有运行非守护线程。申请终止。

..评估者继续添加..

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


使其正常运行的一个可靠方法是创建一个 GUI 元素并显示它。这就是我之前问的原因..

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

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

屏幕截图!

【讨论】:

    猜你喜欢
    • 2016-12-10
    • 2014-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多