java – 我无法启动计时器2次
发布时间:2020-12-15 05:02:48 所属栏目:Java 来源:网络整理
导读:我正在用 Java制作一个计时器,我需要帮助.主类增加了一个挥杆计时器.我有一个jFrame,有2个面板,1个有jLabel,另一个有3个按钮,“开始”,“停止”和“重置”.当我点击开始然后一切正常,当我停止然后重置.但当我再次点击start时,它会抛出这个异常: Exception i
我正在用
Java制作一个计时器,我需要帮助.主类增加了一个挥杆计时器.我有一个jFrame,有2个面板,1个有jLabel,另一个有3个按钮,“开始”,“停止”和“重置”.当我点击开始然后一切正常,当我停止然后重置.但当我再次点击start时,它会抛出这个异常:
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); } } 解决方法
答案在错误消息中.它表示你无法启动已被取消的计时器.您必须使用new运算符创建一个新的Timer.
在start()函数中执行此操作. timer = new Timer(); 如果您决定走这条路线,请不要忘记从声明中删除新操作.您将在start()函数中覆盖赋值. public static定时器; 如果要在运行之间存储时间,则需要在使用新计时器覆盖计时器之前执行此操作. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |