Java – I can’t start the timer twice

I'm making a timer in Java. I need help The main class adds a swing timer I have a JFrame with two panels, one has jlabel, and the other has three buttons, "start", "stop" and "reset" When I click start, then everything is normal, when I stop and then reset But when I click start again, it will throw this exception: @ h_ 403_ 7@

Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: Timer already                                       cancelled.
at java.util.Timer.sched(UnkNown Source)
at java.util.Timer.schedule(UnkNown Source)
at org.stopwatch.Stopwatch.start(Stopwatch.java:71)
at org.stopwatch.Stopwatch$1.actionPerformed(Stopwatch.java:48)
at javax.swing.AbstractButton.fireActionPerformed(UnkNown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(UnkNown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(UnkNown Source)
at javax.swing.DefaultButtonModel.setPressed(UnkNown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(UnkNown Source)
at java.awt.Component.processMouseEvent(UnkNown Source)
at javax.swing.JComponent.processMouseEvent(UnkNown Source)
at java.awt.Component.processEvent(UnkNown Source)
at java.awt.Container.processEvent(UnkNown Source)
at java.awt.Component.dispatchEventImpl(UnkNown Source)
at java.awt.Container.dispatchEventImpl(UnkNown Source)
at java.awt.Component.dispatchEvent(UnkNown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(UnkNown Source)
at java.awt.LightweightDispatcher.processMouseEvent(UnkNown Source)
at java.awt.LightweightDispatcher.dispatchEvent(UnkNown Source)
at java.awt.Container.dispatchEventImpl(UnkNown Source)
at java.awt.Window.dispatchEventImpl(UnkNown Source)
at java.awt.Component.dispatchEvent(UnkNown Source)
at java.awt.EventQueue.dispatchEventImpl(UnkNown Source)
at java.awt.EventQueue.access$200(UnkNown Source)
at java.awt.EventQueue$3.run(UnkNown Source)
at java.awt.EventQueue$3.run(UnkNown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(UnkNown Source)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(UnkNown Source)
at java.awt.EventQueue$4.run(UnkNown Source)
at java.awt.EventQueue$4.run(UnkNown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(UnkNown Source)
at java.awt.EventQueue.dispatchEvent(UnkNown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(UnkNown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(UnkNown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(UnkNown Source)
at java.awt.EventDispatchThread.pumpEvents(UnkNown Source)
at java.awt.EventDispatchThread.pumpEvents(UnkNown Source)
at java.awt.EventDispatchThread.run(UnkNown Source)
import static javax.swing.UIManager.getSystemLookAndFeelClassName;
import static javax.swing.UIManager.setLookAndFeel;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Timer;
import java.util.TimerTask;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Stopwatch {

private static boolean running = false;
public static int time = 0;
public static Timer timer = new Timer();
public static JLabel leftLabel = new JLabel(time + "s");

public static final void main(String[] args) throws Exception {

    setLookAndFeel(getSystemLookAndFeelClassName());
    JFrame f = new JFrame();
    f.setVisible(true);
    f.setSize(1,1);
    f.setTitle("Секундомір");
    f.setDefaultCloSEOperation(3);
    f.setLocationRelativeTo(null);
    JPanel leftPanel = new JPanel();
    f.add(leftPanel,BorderLayout.NORTH);
    leftPanel.add(leftLabel);
    JPanel buttonPanel = new JPanel();
    f.add(buttonPanel,BorderLayout.soUTH);
    JButton startBtn = new JButton("Start");
    JButton stopBtn = new JButton("Stop");
    JButton resetBtn = new JButton("Reset");
    buttonPanel.add(startBtn);
    buttonPanel.add(stopBtn);
    buttonPanel.add(resetBtn);
    startBtn.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent a) {
            running = true;
            start();
        }
    });
    stopBtn.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent a) {
            running = false;
            timer.cancel();
        }
    });
    resetBtn.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent a) {
            if(!running) {
                time = 0;
                leftLabel.setText("0s");
            }
        }
    });
    f.pack();
}

public static void start() {
    timer.schedule(new TimerTask() {
        @Override
        public void run() {
            time++;
            leftLabel.setText(time + "s");
        }
    },1000,1000);
}

}

Solution

The answer is in the error message It means that you cannot start a timer that has been cancelled You must use the new operator to create a new timer@ H_ 403_ 7@

The content of this article comes from the network collection of netizens. It is used as a learning reference. The copyright belongs to the original author.
THE END
分享
二维码
< <上一篇
下一篇>>