有Java Swing Timer和无限循环的问题

时间:2014-11-07 17:25:38

标签: java swing timer

我在Java中遇到了一段代码问题,它似乎在创建一个无限循环。

public void progress(){
    x = 3;

    timer = new Timer(800, new ActionListener() {
            public void actionPerformed(ActionEvent evt){
                System.out.println(x);
                x--;

                if(x < 1){
                    UI();
                    timer.stop();
                }
            }
        });

    timer.start();
}

方法UI要求通过SavitchIn输入,并且它似乎没有运行该行。我在UI方法中请求输入之前打印,打印效果很好。当我从我的代码中删除此计时器,并保持UI方法相同时,它工作正常。打印然后输入。我也在UI方法中添加了一个timer.stop(),我很肯定计时器已停止,但是在运行程序后,我被迫在下次重置虚拟机,否则它将不会运行。任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:2)

您的UI()方法可能应该在后台线程上调用,因为它可能会占用Swing事件线程(我们必须猜测,因为您不会显示它)。因此,创建一个SwingWorker或后台线程并在那里进行此调用。有关详情,请阅读Concurrency in Swing

如,

public void progress() {
  x = 3;

  timer = new Timer(800, new ActionListener() {
     public void actionPerformed(ActionEvent evt) {
        System.out.println(x);
        x--;

        if (x < 1) {
           new Thread(new Runnable() {
              public void run() {
                 UI();
              }
           }).start();
           timer.stop();
        }
     }
  });

  timer.start();
}