How to handle Timers correctly in Java?

2020-04-11 08:10发布

问题:

I want my timer to execute the actionPerformed method only one time once it 5 seconds the time but it is writing in the console "Hello" lots of times:

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();
    }
}

How can I make the effect I want? Thanks

回答1:

As already mentioned, it's better to use java.util.Timer, but you can also use setRepeats() before starting:

timer.setRepeats(false);


回答2:

Don't neglect to use the event dispatch thread. There's nothing wrong with java.util.Timer, but javax.swing.Timer has several advantages with 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();
            }
        });
    }
}

If using java.util.Timer, update the GUI using a continuation.



回答3:

Sounds like you want a java.util.Timer rather than a javax.swing.Timer.



回答4:

class MyTask extends TimerTask {
    public void run() {
      System.out.println("Hello");

    }
  }

and then

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


回答5:

This should do the trick!

new JFrame().setVisible(true);