ユーザーがなんらかのアクション (ボタンのクリックなど) を行ったときに、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 秒後に表示されたままになります。
この問題に対処するより良い方法はありますか?