多次调用 startTimer 方法(Java)

Calling startTimer Method Multiple Times(Java)

所以我一直在浏览网页寻找答案,但感到不知所措,似乎找不到对此的解释。对于我的 类 之一,我们得到了一个示例,其中的代码与我正在使用的代码非常相似,我复制了它(我知道这很危险,但不确定该怎么做。)

我试图做到这一点,以便在按下按钮时 JLabel 读取特定文本,5 秒后该文本消失。我已经能够成功地做到这一点,但有一个陷阱。我有 6 个共享同一个 ActionListener 的 JButton,它们可以在适当的条件下调用 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只是为了调试。非常感谢任何帮助。

It does not seem like good coding practice to leave a bunch of timers running in the background

一般来说,不,如果可以的话,您不希望拥有多个 Swing Timers 运行ning。它们不会很好地扩展(你添加的越多,最糟糕的事情就会变得)。如果您尝试做相同或相似的事情,请尝试使用尽可能少的 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 运行ning 并且只会在 5 秒内启动一次。

so how do I stop them?

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

How can I make the timer restart to 5 seconds everytime the button is pressed?

只需调用restart

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

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