问题,我只能执行一次计时器。我知道它是因为我调用了函数timer2.cancel();和timer1.cancel(); ::取消“永远不再运行”。我需要一个替换功能,一个实际上停止计时器的功能,但是当我重新安排时它可以重新启动。我该怎么做呢?
public void actionPerformed (ActionEvent e){
if (e.getSource()==jbtStart)
{
System.out.println("Start is pressed");
timer2.cancel();
timer1.schedule(new Task(), 0, delay);
}
else if (e.getSource()==jbtStop)
{
System.out.println("Stop is pressed");
timer1.cancel();
timer2.schedule(new Task2(), 0, delay);
}
答案 0 :(得分:2)
为什么不在此时创建新的Timer
?或者,或者保持TimerTask
以及计时器,并取消那个而不是计时器本身。
作为第三个可能的替代方案,拥有一个计时器任务和一个计时器,但让计时器任务知道它在任何时候的意图 - 看起来你有效地切换每次计时器滴答时你想做什么。您可以始终保留两个单独的类来分隔逻辑功能,然后有一个“包装器”任务,它允许您替换每次运行时执行的行为。
答案 1 :(得分:1)
我会取消TimerTasks而不是Timers(我只使用一个Timer)。
更新:
private Task task1;
private Task2 task2;
public void actionPerformed (ActionEvent e){
if (e.getSource()==jbtStart)
{
System.out.println("Start is pressed");
if (task2 != null) {
task2.cancel();
}
task1 = new Task();
timer.schedule(task1, 0, delay);
}
else if (e.getSource()==jbtStop)
{
System.out.println("Stop is pressed");
if (task1 != null) {
task1.cancel();
}
task2 = new Task2();
timer.schedule(task2, 0, delay);
}