1

当用户执行某些操作(例如单击按钮)时,我需要在 JLabel 中显示状态。此状态需要在 2 秒后消失。我为此使用以下内容。

Timer timer = new Timer(2000, new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
                label.setVisible(false);
        }
    });

但是,用户可能多次单击该按钮并且该计时器被多次触发。这具有不希望的效果。当一个按钮被点击 3 次时。

第 0 秒:第 1 次点击:标签在第 2 秒消失

第 1 秒:第 2 次点击:标签在第 3 秒消失

第 2 秒:第 3 次点击:标签在第 4 秒消失

在这里,标签需要在第 4 秒后消失,但会在第 2 秒后消失。因此,我希望仅在最后一个事件后延迟 2 秒隐藏此标签

为了处理这个问题,我使用了一个原子计数器。

AtomicInteger counter = new AtomicInteger(0);

使用 counter.incrementAndGet() 为每个任务分配一个唯一的“taskCounter”

.

  Timer timer = new Timer(5000, new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            if (counter.get() == taskCounter) {
                infoLabel.setVisible(false);
            }
        }
    });
    timer.start();

只有当它是最后一个被触发的事件时才会执行上述操作。确保我的标签在最后一个事件后至少 2 秒保持可见。

有没有更好的方法来处理这个问题?

4

1 回答 1

3

给定 的两个实例java.swing.Timer,让t1以小于两秒的某个名义速率开火。让ActionListenerfort1更新label并调用restart()on t2,这应该有两秒的初始延迟。让ActionListenerfort2 stop()本身并调用label.setVisible(false).

于 2016-05-20T09:27:59.877 回答