如何停止Javax.Swing.timer?

如何停止Javax.Swing.timer?,java,swing,timer,Java,Swing,Timer,我是一个java新手,我正在使用netbeans创建一个调度程序。我的软件将从用户那里获得时间和操作,并将这些数据输入到单独的ArrayList中。然后我使用javax.swing.timer来启动倒计时。当用户完成输入数据并点击“运行”按钮时,计时器将从数组列表中的第一个元素获取运行时间并开始倒计时。当倒计时时间达到0时,计时器将从数组列表中的下一个元素获取倒计时时间,依此类推 我的问题是,计时器运行得很好,但当arraylist中没有更多元素时,它仍然不会停止。请帮我做这个。以下是我的代码中

我是一个java新手,我正在使用netbeans创建一个调度程序。我的软件将从用户那里获得时间和操作,并将这些数据输入到单独的ArrayList中。然后我使用javax.swing.timer来启动倒计时。当用户完成输入数据并点击“运行”按钮时,计时器将从数组列表中的第一个元素获取运行时间并开始倒计时。当倒计时时间达到0时,计时器将从数组列表中的下一个元素获取倒计时时间,依此类推

我的问题是,计时器运行得很好,但当arraylist中没有更多元素时,它仍然不会停止。请帮我做这个。以下是我的代码中有问题的部分:

private void btnstartRunActionPerformed(java.awt.event.ActionEvent evt) {                                            
  countdown = ActionTime.get(0);
  Action.setText(ActionName.get(c));
  timer = new Timer(1000,new ActionListener(){
    @Override
    public void actionPerformed(ActionEvent event){

      if(countdown<=0){
          try{
            c++;
            Action.setText(ActionName.get(c));
            //this nested if statement is to check whether the array has any more elements.
            //(This is the part that doesn't work.)
            if(c >= ActionTime.size()){
              timer.stop();
              JOptionPane.showMessageDialog(null, "Workout Completed!");
            }  
            countdown=ActionTime.get(c);
            timer.restart();

          } catch (Exception error2){
          }
       }
       Time.setText(Integer.toString(countdown));
       countdown--;
     }
  });
  timer.start();
}                                           
private void btnstartRunActionPerformed(java.awt.event.ActionEvent evt){
倒计时=ActionTime.get(0);
Action.setText(ActionName.get(c));
计时器=新计时器(1000,新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件){

如果(倒计时以下是一个示例:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;
import javax.swing.Timer;

public class Main extends JFrame {
    Timer timer;

    int counter;

    Main(String title) {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        ActionListener a = new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                System.out.println("Counter = " + counter);

                if (++counter > 10) {
                    timer.stop();
                    System.exit(0);
                }
            }
        };

        timer = new Timer(300, a);
        timer.start();

        pack();
        setVisible(true);
    }

    public static void main(String[] args) {
        new Main("Timer Demo1");
    }
}
您应该更改:

            c++;
            Action.setText(ActionName.get(c)); //move this down
            if(c>=ActionTime.size()){
                timer.stop();
                JOptionPane.showMessageDialog(null, "Workout Completed!");
            }
致:

因为当您尝试执行
ActionName.get(c)
时,当
c
的值超过最大可能值时,
get
方法将抛出一个
异常
。这将导致您犯的第二个错误:

           catch(Exception error2){

           }
这样做会使程序忽略
异常
并继续运行,就好像什么也没发生一样。一个容易犯的错误会欺骗您,让您认为其他事情是错误的,但现在您知道了!将其更改为:

           catch(Exception error2){
                error2.printStackTrace();
                System.exit(-1); //or some error handling
           }

或者删除
try/catch
块,以便
异常
将结束您的程序或以其他方式处理。

为了更快获得更好的帮助,请发布一个。停止
计时器的典型方法是调用
Timer.stop()
。我很惊讶
ActionName.get(c)没有出现错误
:/
顺便说一句-将形式为
catch(异常e){..
的代码更改为
catch(异常e){e.printStackTrace();//非常有用!。
@ADTC他们可能会得到一个
异常
,代码捕获并忽略了它们!啊,是的,我看到了..哇,这么多初学者犯了忽略
异常的错误
…他们也可以删除try/catch。据我所知,这是没有理由的。@Radiodef是的,但这个可怜的孩子是一个ginner。我们不要把它们混淆了。
:)
不管怎样,我已经添加了一个注释。好吧,我按照你说的做了。我删除了try-catch块,并完全按照你的建议更改了代码。在数组的末尾,它会显示一个消息框,上面写着“训练完成!”但它在输出窗口中显示了一系列错误。是否有任何错误
超出边界异常
?如果没有,它们是什么?错误是您的朋友。不要将它们视为“一系列错误”而忽略。查看它们,您会发现它们对解决程序中的问题非常有用。可能需要添加一个
return;
语句作为
if
块的最后一个语句,否则程序将继续执行出现在
if
块之后的语句。(请参阅我的新编辑。)
           catch(Exception error2){
                error2.printStackTrace();
                System.exit(-1); //or some error handling
           }