如何discard/coalesce重复AWT事件?

How to discard/coalesce repeated AWT events?

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

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

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

但是,有可能用户点击按钮多次,多次触发这个定时器。这会产生不良影响。例如当按钮被点击 3 次时。

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

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

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

这里,标签需要在第4秒后消失,但会在第2秒后消失。因此,我希望仅在 last event

之后延迟 2s 隐藏此标签

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

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 秒保持可见。

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

给定 java.swing.Timer 的两个实例,让 t1 以小于两秒的某个标称速率触发。让 t1ActionListener 更新 label 并在 t2 上调用 restart(),这应该有两秒的初始延迟。让 ActionListener for t2 stop() 本身并调用 label.setVisible(false).