提问者:小点点

有问题Java摆动定时器和无限循环


我在 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个答案

匿名用户

您的UI()方法可能应该在后台线程上调用,因为它可能会绑定Swing事件线程(我们必须猜测,因为您没有显示它)。因此,创建一个SwingWorker或后台线程并在那里进行此调用。有关这方面的更多信息,请阅读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();
}