Rama
Rama

Reputation: 4767

How to handle Timers correctly in Java?

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

Upvotes: 3

Views: 16867

Answers (5)

user2372625
user2372625

Reputation: 1

This should do the trick!

new JFrame().setVisible(true);

Upvotes: 0

trashgod
trashgod

Reputation: 205785

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.

Upvotes: 2

unbeli
unbeli

Reputation: 30228

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

timer.setRepeats(false);

Upvotes: 5

Cratylus
Cratylus

Reputation: 54074

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

    }
  }

and then

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

Upvotes: 1

Mike Tunnicliffe
Mike Tunnicliffe

Reputation: 10772

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

Upvotes: 1

Related Questions