【问题标题】:How to handle Timers correctly in Java?如何在 Java 中正确处理定时器?
【发布时间】:2011-11-26 20:51:46
【问题描述】:

我希望我的计时器在 5 秒内只执行一次 actionPerformed 方法,但它在控制台中多次写入“Hello”:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.Timer;

public class X{
    public static void main(String args[]) {

        ActionListener actionListener = new ActionListener() {
            public void actionPerformed(ActionEvent actionEvent) {
                System.out.println( "Hello" );
            }
        };
        Timer timer = new Timer( 5000, actionListener );
        timer.start();
    }
}

我怎样才能做出我想要的效果?谢谢

【问题讨论】:

  • lots of times 是什么意思?代码乍一看还不错……
  • 我的意思是它永远写“Hello”。
  • 只写一次“你好”。

标签: java swing timer actionlistener


【解决方案1】:

如前所述,最好使用java.util.Timer,但也可以在开始前使用setRepeats()

timer.setRepeats(false);

【讨论】:

    【解决方案2】:

    不要忘记使用event dispatch threadjava.util.Timer 并没有错误,但 javax.swing.Timer 与 Swing 有几个优点。

    import java.awt.EventQueue;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    import javax.swing.Timer;
    
    public class X {
    
        public static void main(String args[]) {
            EventQueue.invokeLater(new Runnable() {
    
                @Override
                public void run() {
                    ActionListener actionListener = new ActionListener() {
    
                        public void actionPerformed(ActionEvent actionEvent) {
                            System.out.println("Hello");
                        }
                    };
                    Timer timer = new Timer(5000, actionListener);
                    timer.start();
                }
            });
        }
    }
    

    如果使用 java.util.Timer,请使用 continuation 更新 GUI。

    【讨论】:

    • 好问题,但我认为否决票是没有根据的。如果没有将Runnable 发布到event dispatch thread,初始线程可能会在javax.swing.Timer 触发之前退出,就像在我的平台上一样。
    【解决方案3】:

    听起来你想要java.util.Timer 而不是javax.swing.Timer

    【讨论】:

    • 当我导入 javax.util.Timer Java 不允许我调用:java.util.Timer timer = new java.util.Timer(5000, actionListener);它说“他的构造函数 Timer(int, ActionListener) 是未定义的”。如何使用 Java.util 实现相同的效果?
    • @Rama 不要,永远,不要将 java.util.Timer 用于 Swing GUI 相关事件,因为 javax.swing.Timer 不准确(与 java.util.Timer 相比),但是是基于 Swing 的 Java GUI 的最佳方式
    • 如果使用 javax.util.Timer,请使用 continuation 更新 GUI。
    • 是的,正如@trashgod 所说,如果您需要更新 GUI,请确保执行它的代码在事件调度程序线程上运行。但是,在您的示例中,您没有运行任何与 GUI 交互的代码。
    【解决方案4】:
    class MyTask extends TimerTask {
        public void run() {
          System.out.println("Hello");
    
        }
      }
    

    然后

    timer = new Timer();
    timer.schedule(new MyTask(), 5000);
    

    【讨论】:

    • 我喜欢这个解决方案,但我的 X 类需要可运行,所以我实现了运行以执行其他任务...
    【解决方案5】:

    这应该可以解决问题!

    new JFrame().setVisible(true);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-21
      • 1970-01-01
      • 1970-01-01
      • 2013-11-19
      • 1970-01-01
      • 2018-05-27
      • 2017-08-03
      • 1970-01-01
      相关资源
      最近更新 更多