Reputation: 41
For some reason my java timer is not working in one of my programs. Whenever I compile my code, it gives me the following error:
Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException:
Task already scheduled or cancelled
at java.util.Timer.sched(Timer.java:401)
at java.util.Timer.scheduleAtFixedRate(Timer.java:328)
Why is this? (Note: I am a novice at Java timers)
//Timer Prerequisites
Timer timer = new Timer();
TimerTask task = new TimerTask()
{
public void run()
{
System.out.println("We have waited one second.");
}
};
//Check to see if user has enetered anything
while(!answered)
{
timer.scheduleAtFixedRate(task, 0, duration);
afk = true;
incorrect += 1;
answered = true;
}
Upvotes: 1
Views: 1432
Reputation: 24626
Since as noted in the tag, you should be using Swing
Timer, instead of using the java.util.Timer
.
Please have a look at this sample example:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class SwingTimerExample {
private String[] questions = {
"How are you?",
"How is your day?",
"Will you work tonight?"
};
private JLabel questionLabel;
private ButtonGroup radioGroup;
private JRadioButton yesRadioButton;
private JRadioButton noRadioButton;
private int counter;
private static final int GAP = 5;
private Timer timer;
private ActionListener timerActions = new ActionListener () {
@Override
public void actionPerformed ( ActionEvent ae ) {
++counter;
counter %= questions.length;
questionLabel.setText ( questions [ counter ] );
if ( counter == questions.length - 1 ) {
( ( Timer ) ae.getSource () ).stop ();
}
}
};
public SwingTimerExample () {
counter = 0;
}
private void displayGUI () {
JFrame frame = new JFrame ( "Swing Timer Example" );
frame.setDefaultCloseOperation ( JFrame.DISPOSE_ON_CLOSE );
JPanel contentPane = new JPanel ();
contentPane.setBorder ( BorderFactory.createEmptyBorder (
GAP, GAP, GAP, GAP ) );
contentPane.setLayout ( new BorderLayout ( GAP, GAP ) );
JPanel labelPanel = new JPanel ();
questionLabel = new JLabel (
questions [ counter ], JLabel.CENTER);
labelPanel.add ( questionLabel );
JPanel radioPanel = new JPanel ();
yesRadioButton = new JRadioButton ( "YES" );
noRadioButton = new JRadioButton ( "NO" );
radioGroup = new ButtonGroup ();
radioGroup.add ( yesRadioButton );
radioGroup.add ( noRadioButton );
radioPanel.add ( yesRadioButton );
radioPanel.add ( noRadioButton );
contentPane.add ( labelPanel, BorderLayout.CENTER );
contentPane.add ( radioPanel, BorderLayout.PAGE_END );
frame.setContentPane ( contentPane );
frame.pack ();
frame.setLocationByPlatform ( true );
frame.setVisible ( true );
timer = new Timer ( 5000, timerActions );
timer.start ();
}
public static void main ( String[] args ) {
Runnable runnable = new Runnable () {
@Override
public void run () {
new SwingTimerExample ().displayGUI ();
}
};
EventQueue.invokeLater ( runnable );
}
}
Upvotes: 3
Reputation: 68715
Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: Task already scheduled or cancelled at java.util.Timer.sched(Timer.java:401) at java.util.Timer.scheduleAtFixedRate(Timer.java:328)
Because you are trying to add the same task again here:
timer.scheduleAtFixedRate(task, 0, duration);
Upvotes: 1
Reputation: 41281
A Timer
can only be scheduled once, but the scheduling itself is at a fixed rate. Simply call the timer.scheduleAtFixedRate
method once. If you need to start the same timer task later, you will need to construct a new java.util.Timer
.
Upvotes: 1