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