如何改变标签的文本在Java中后,计时器滴答第二通过呢?(How do you change lab

2019-10-21 04:36发布

我有5秒的延迟的计时器。 我想之后的第二次通过充当倒计时更改名为lblTimer标签。 我有问题,用它作为目前它只能在5秒。 你有什么suggestionsuggestions?

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"); 
    }
}

Answer 1:

在回答你的问题,我认为是“为什么会发生这种不工作?”,就是在任何时候你重新检查所经过的时间。 可变延迟总是被设置在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");

不要真正做到这一点,除非你需要满足你生病的恋物癖。

四衬垫

与上述相同。 不要这样做。

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

可接受的解决方案:

使用计时器安排任务给定的时间段后执行。 您可以使用定时器多次也火了相同的任务在给定的时间间隔。

    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);

最好的解决办法:

取而代之的是定时器,使用ScheduledExecutorService的 。 这是因为ScheduledExecutorService的工作与线程,而不是定时的方式更好。 谷歌一下。

    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);

编辑:正如斯蒂芬指出,对Swing GUI的应用挥杆定时器将是最好的选择。



Answer 2:

它应该是这个样子:

1)创建定时器

2)创建的TimerTask并实现run方法(更新计数变量,并检查计数器是零。如果是零,停止计时器)

3)安排运行每第二任务

int count = [INITVALUE];

...

public void startMethod() {
    final Timer timer = new Timer();
    timer.shedule(new TimerTask() {
          @Override
          public void run() {
             count--;
             lblTimer.setText(count+"");
             if (count == 0) {
               timer.cancel();
               timer.purge();
             }
          }
    },1000);

}


Answer 3:

大拇指@Olavi Mustanoja你的答案透露我现在之前从未尝试过的选项。 当他在他的最后编辑建议javax.swing.Timer中是非常方便的,如果你使用GUI的工作。

import javax.swing.Timer;

private int secondsToWait = 5000; //Time in milliseconds
private Timer timer;

....

//The following section should be inside a method member
timer = new Timer(secondsToWait, e -> {
        if(secondsToWait == 0)
            timer.stop();//Stop if secondsToWait is already zero
        lblTimer.setText((secondsToWait/1000) + ""); //Update the label with the current sec
        timer.setDelay(secondsToWait);
        secondsToWait -= 1000; //Reduce time by 1sec each time
    });
    timer.start();

...


文章来源: How do you change label text in java after a timer ticks a second passed?