如何使Java类在不临时冻结应用程序的情况下更新JavaFX标签的文本?

时间:2020-04-09 22:28:09

标签: java javafx timer countdown

我正在创建20-minute countdown timer application。我为实现此目的而编写的逻辑在总体上应该是这样工作的:

1)按下按钮后,应用程序线程中的播放按钮ActionEvent将运行。

2)然后,计时器在CountdownTimer.java中的while循环中运行,直到达到00:00:00(分钟,秒,厘秒)为止。每个循环都应在适当的时间更新JavaFX计时器标签。

问题:

单击播放按钮时,应用程序UI冻结(Apple彩虹轮旋转直到计时器结束)。但是,当我单击“播放”按钮时,计时器的时间会在IDE控制台中打印出来。我只想用在控制台中成功打印的时间刷新JavaFX标签。

控制台中显示的内容:

Times printing out in console

我尝试过的事情:

我已经使用了Timer和TimerTask,Platform.runLater(Runnable runnable),Task和Thread类,以使我的timerLabel达到我希望的工作方式,但是由于以下原因,我的实现均未起作用这些课程是我的新手技能。

我应该如何实现当前代码,以便实际上更新JavaFX标签?

我的代码:

应用程序线程中的播放按钮代码:

    // create twenty minute Countdown timer minutes:seconds:milliseconds
    CountdownTimer timer = new CountdownTimer();

    // create label for our countdown timer
    timerLabel = new Label("20:00:00");
    timerLabel.setFont(new Font(30));
    timerLabel.setTextFill(Color.BLACK);
    timerLabel.setMinSize(200, 35);
    timerLabel.setMaxSize(200, 35);    

    playBtn.setOnAction(e -> {
      timer.runTimer();
    });
CountdownTimer.java中的

计时器代码:

      public class CountdownTimer {

      private int minutes;
      private int seconds;
      private int milliseconds;

    public CountdownTimer() {
      this.minutes = 19;
      this.seconds = 59;
      this.milliseconds = 99;
    }

    public void runTimer() {
      while (true) {
        Application.timerLabel.setText(minutes + ":" + seconds + ":" + milliseconds);

        if (minutes < 10) {
            System.out.println("0" + minutes + ":" + seconds + ":" + milliseconds);
        } if (seconds < 10) {
            System.out.println(minutes + ":" + "0" + seconds + ":" + milliseconds);
        } if (milliseconds < 10) {
            System.out.println(minutes + ":" + seconds + ":" + "0" + milliseconds);
        } else {
            System.out.println(minutes + ":" + seconds + ":" + milliseconds);
        }

        try {
          Thread.sleep(1);
        } catch (InterruptedException ex) {
            Logger.getLogger(CountdownTimer.class.getName()).log(Level.SEVERE, null, ex);
        }

        if (seconds > 0 && milliseconds == 0) {
            seconds--;
            milliseconds = 100;
        }
        if (milliseconds > 0) {
            milliseconds--;
        } else {
            milliseconds = 100;
            milliseconds--;

            seconds = 59;
            minutes--;
        }

        if (minutes == 0 && seconds == 0 && milliseconds == 0) {
            Application.timerLabel.setText("00:00:00");
            System.out.println("00:00:00");
            break;
        }
      }
    }
  }   

0 个答案:

没有答案