gpt4 book ai didi

java - 我无法启动计时器 2 次

转载 作者:搜寻专家 更新时间:2023-11-01 04:07:58 25 4
gpt4 key购买 nike

我正在用 Java 制作一个计时器,我需要帮助。主类中添加了一个 Swing 计时器。我有一个 jFrame,它有 2 个面板,1 个有 jLabel,另一个有 3 个按钮,“开始”、“停止”和“重置”。当我单击开始时,一切正常,当我停止时,然后重置。但是当我再次点击开始时,它会抛出这个异常:

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)

这是我的代码: 包 org.stopwatch;

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

如果您决定走这条路,请不要忘记从您的声明中删除 new 操作。您将覆盖 start() 函数中的分配。

public static Timer定时器;

如果您想存储两次运行之间的时间,您需要在用新计时器覆盖计时器之前执行此操作。

关于java - 我无法启动计时器 2 次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21682031/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com