如何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
以小于两秒的某个标称速率触发。让 t1
的 ActionListener
更新 label
并在 t2
上调用 restart()
,这应该有两秒的初始延迟。让 ActionListener
for t2
stop()
本身并调用 label.setVisible(false)
.
当用户执行某些操作(例如单击按钮)时,我需要在 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
以小于两秒的某个标称速率触发。让 t1
的 ActionListener
更新 label
并在 t2
上调用 restart()
,这应该有两秒的初始延迟。让 ActionListener
for t2
stop()
本身并调用 label.setVisible(false)
.