【问题标题】:Java Swing Timer infinite loopJava Swing Timer 无限循环
【发布时间】:2015-04-24 12:53:53
【问题描述】:

我在设置一个简单的 Java swing Timer 时遇到问题。在不得不停下来之前,它一切正常。我认为它在定时器上创建了一个无限循环的定时器,但我一直在关注多个教程,但我看不出我哪里出错了。

代码说明:runButtonListener 需要循环的次数与 filelinecount 变量所说的一样多(从不同的函数中读取)。目前的代码只是打印到系统中,稍后我将让它更新一些动画。 filelinecount 在下面的代码中为 0,但会被不同的函数更改。所以为了调试,我认为如果你手动更改filelinecount的值,附加的代码是可以运行的。

非常感谢任何帮助

private int filelinecount = 0;
private int timercount = 0;
private Timer timer;

class runButtonListener implements ActionListener{

    @Override
    public void actionPerformed(ActionEvent e){

        // LOOK AT TIMER!!!
        if (timercount == filelinecount) {
            timer.stop();
            System.out.println("stopping");
            //timercount = 0;
        } else {
            System.out.println("yo " + timercount + "," + filelinecount);

            timercount++;
        }

        timer = new Timer(100,this);
        timer.start();
    }
}

【问题讨论】:

    标签: java swing timer actionlistener infinite-loop


    【解决方案1】:

    每次计时器回叫您时,您都会创建一个新计时器并启动它。

    这包括您致电timer.stop()!

    如果你想继续,你只需要创建新的计时器。

    确实,您应该考虑另一种方法来执行此操作,而不是不断地重新创建计时器。有几种方法可用,具体取决于您的具体要求。

    例如使用scheduleAtFixedRate、使用工作线程或SwingWorkerScheduledExecutorService

    【讨论】:

    • 嗯,我希望它循环的次数与它读取的文件长度一样多,所以在读取文件之前它是未知的。我如何对其进行编码以便它不会继续重新创建计时器?我是否应该将计时器操作更改为另一个函数,以便它运行该函数 x 次?
    • 为什么要在每行之间有 100 毫秒的延迟?听起来您只想在这里使用 SwingWorker。 docs.oracle.com/javase/tutorial/uiswing/concurrency/worker.html
    • 延迟 100 毫秒是为了以后更新 GUI 时。我之前尝试过实现 Swingworking,但我不太明白如何将它应用到我的代码(MVC 架构)中,而且我阅读的所有帖子似乎都暗示摇摆计时器更容易实现
    猜你喜欢
    • 1970-01-01
    • 2016-05-13
    • 1970-01-01
    • 1970-01-01
    • 2017-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-21
    相关资源
    最近更新 更多