计时器滴答一秒后,如何更改 Java 中的标签文本?

1 java swing timer jlabel

我有一个延迟 5 秒的计时器。我试图在经过一秒钟后更改名为 lblTimer 的标签以用作倒计时。我遇到了问题,因为目前它只能在 5 秒内工作。你有什么建议建议吗?

protected void Addition() {
    //addition function 

    final int delay = 5000; //milliseconds

    ActionListener taskPerformer = new ActionListener() {
        @SuppressWarnings("unused")
        public void actionPerformed(ActionEvent evt) {
            //...Perform a task...
            frame.getContentPane().setBackground(Color.red);
        }
    };

    new Timer(delay, taskPerformer).start();
    Random RandomNumber = new Random();
    int number1 = RandomNumber.nextInt(12);
    int number2 = RandomNumber.nextInt(12);
    int number3 = RandomNumber.nextInt(12);
    lblAnswer.setText("");
    lblFirstNumber.setText(""+ number1);
    lblfunction1.setText("+");
    lblsecondNumber.setText(""+number2);
    lblfunction2.setText("+");
    lblthirdnumber.setText(""+number3);
    lblequals.setText("=");
    answer = number1+number2+number3;
    if(delay <= 1000){
        lblTimer.setText("1"); 
    }    
    else if(delay == 2000){
        lblTimer.setText("2"); 
    }    
    else if(delay == 3000){
        lblTimer.setText("3"); 
    } 
    else if(delay == 4000){
        lblTimer.setText("4"); 
    }    
    else if (delay == 5000){
        lblTimer.setText("5"); 
    }
}
Run Code Online (Sandbox Code Playgroud)

Ola*_*oja 5

你的问题的答案,我假设是“为什么这不起作用?”,是不是你在任何时候都不会重新检查经过的时间。可变延迟始终设置为 5000,并且从不更新。

愚蠢的解决方案:

lblTimer.setText("5");
Thread.sleep(1000)
lblTimer.setText("4");
Thread.sleep(1000)
lblTimer.setText("3");
Thread.sleep(1000)
lblTimer.setText("2");
Thread.sleep(1000)
lblTimer.setText("1");
Thread.sleep(1000)
lblTimer.setText("0");
Run Code Online (Sandbox Code Playgroud)

不要真的这样做,除非你需要满足你生病的恋物癖。

四线

和上面一样。不要这样做。

for (int i = secondsToWait; i >= 0; i--) {
    lblTimer.setText(i + "");
    Thread.sleep(1000);
}
Run Code Online (Sandbox Code Playgroud)

可接受的解决方案:

使用计时器来安排在给定时间段后执行的任务。您还可以使用计时器在给定的时间间隔内多次触发同一任务。

    Timer timer = new Timer();

    int secondsToWait = 5;
    TimerTask task = new TimerTask() {
        @Override
        public void run() {
            secondsToWait--;
            lblTimer.setText(secondsToWait + "");
            if (secondsToWait == 0) {
                timer.cancel();
                timer.purge();
            }
        }
    };

    lblTimer.setText(secondsToWait + "");
    timer.scheduleAtFixedRate(task, 1000, 1000);
Run Code Online (Sandbox Code Playgroud)

最佳解决方案:

使用ScheduledExecutorService代替计时器。这更好,因为 ScheduledExecutorService 使用线程而不是 Timer 的方式。去谷歌上查询。

    ScheduledExecutorService exec = Executors.newScheduledThreadPool(1);

    int secondsToWait = 5;
    Runnable task = new Runnable() {
        @Override
        public void run() {
            secondsToWait--;
            lblTimer.setText(secondsToWait + "");
            if (secondsToWait == 0) {
                exec.shutdown();
            }
        }
    };

    lblTimer.setText(secondsToWait + "");
    exec.scheduleAtFixedRate(task, 1, 1, TimeUnit.SECONDS);
Run Code Online (Sandbox Code Playgroud)

编辑:正如 Stefan 指出的那样,对于 Swing GUI 应用程序,Swing Timer将是最佳选择。