多次调用startTimer方法(Java)

时间:2015-02-01 20:47:48

标签: java timer actionlistener

所以我一直在网上浏览答案,但感到不知所措,似乎无法找到解释。对于我的一个课程,我们得到了一个代码,其代码与我正在使用的代码非常相似,我将其复制(危险我知道,但不知道如何去做。)

我正在努力使它在按下按钮时JLabel读取某个文本,5秒后文本消失。我已经成功地做到了这一点,但有一个问题。我有6个JButton共享相同的ActionListener,它可以在适当的条件下调用startStatusTimer方法。

如果按下一个按钮,并在5秒内按下另一个按钮,它会启动另一个计时器,按下的按钮越多,我得到的计时器就越多,似乎永远不会停止。文本最终会消失,但只有在按下第一个按钮5秒后才会消失。

在几秒钟内多次按下按钮后,我一直在计数值> 5打印出来但由于if语句,我看不出这是怎么回事。

让一堆计时器在后台运行似乎不是一种好的编码习惯,那么如何阻止它们呢?

private void startStatusTimer()
{
    ActionListener taskPerformer = new ActionListener() 
    {
        int count=0;
        public void actionPerformed(ActionEvent event) 
        {
            count++;
            System.out.println(count);
            if(count>=5)
            {
                statusLabel.setText("");
                statusTimer.stop();
            }
        }
    };
    statusTimer = new Timer(second, taskPerformer);
    statusTimer.start();
}

System.out.println仅用于调试。非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

  

让一堆计时器在后台运行似乎不是一个好的编码实践

一般来说,不,你不想让多个Swing Timer运行,如果你能提供帮助的话。它们不会很好地扩展(你添加的越多,最糟糕的事情就变成了)。如果您尝试执行相同或类似的操作,请尝试使用尽可能少的Timer

相反,请尝试创建Timer ...

的单个实例
 public class ... {
     private Timer wipeOutTimer;

     public ...() {
          wipeOutTimer = new Timer(5000, new ActionListener() {
              public void actionPerformed(ActionEvent event) 
              {
                  statusLabel.setText("");
              }
          });
          wipeOutTimer.setRepeats(false);
    }

然后在startStatusTimer中,您可以查看Timer ...

的状态
private void startStatusTimer() {
    if (!wipeOutTimer.isRunning()) {
        wipeOutTimer.start();
    }

这将确保无论您按下按钮多少次,同时只会运行一次Timer,并且只会在5秒钟内启动一次。

  

所以如何阻止它们呢?

这取决于你想要做什么。您可以使用setRepeats(false),因此计时器只会运行一次。您还可以使用isRunning检查Timer是否已在运行,如果您愿意,甚至可以使用restart来重置计时器...

  

每次按下按钮,如何让计时器重启5秒?

只需致电restart

private void startStatusTimer() {
    if (!wipeOutTimer.isRunning()) {
        wipeOutTimer.start();
    } else {
        wipeOutTimer.restart();
    }

您实际上每次都可以调用restart,但这说明了一些您​​可能不知道的其他功能......