在java中,当计时器倒计时结束时,如何创建弹出消息窗口?

在java中,当计时器倒计时结束时,如何创建弹出消息窗口?,java,javafx,Java,Javafx,当我尝试实现弹出窗口时,我做了如下操作: OptionController中的代码段: static int SECOND = 100; Timer timer = new Timer(); TimerTask task = new TimerTask() { @Override public void run() { SECOND--; if (SECOND == 0) { t

当我尝试实现弹出窗口时,我做了如下操作:

OptionController中的代码段:

static int SECOND = 100;

Timer timer = new Timer();
  TimerTask task =
      new TimerTask() {
        @Override
        public void run() {

          SECOND--;

          if (SECOND == 0) {
            timer.cancel();

            try {
              AlertController.courtChangeAlert("Time's up."); // line 56
            } catch (IOException e) {
              e.printStackTrace();
            }
          }
        }
      };

public void clickTimerStart() throws IOException {
  timer.scheduleAtFixedRate(task, 1000, 1000);
}
public static void courtChangeAlert(String alert) throws IOException {
    FXMLLoader fxmlLoader =
        new FXMLLoader(AlertController.class.getResource("/view/CourtChangeAlert.fxml"));
    showScene(fxmlLoader, alert); // line 43
  }

private static void showScene(FXMLLoader fxmlLoader, String alert) throws IOException {
    AnchorPane alertPane = fxmlLoader.load();
    AlertController alertController = fxmlLoader.getController();
    alertController.setAlertLabel(alert);
    Scene scene = new Scene(alertPane);
    Stage stage = new Stage();  // line 51
    stage.setScene(scene);
    stage.show();
  }
AlertController中的代码段:

static int SECOND = 100;

Timer timer = new Timer();
  TimerTask task =
      new TimerTask() {
        @Override
        public void run() {

          SECOND--;

          if (SECOND == 0) {
            timer.cancel();

            try {
              AlertController.courtChangeAlert("Time's up."); // line 56
            } catch (IOException e) {
              e.printStackTrace();
            }
          }
        }
      };

public void clickTimerStart() throws IOException {
  timer.scheduleAtFixedRate(task, 1000, 1000);
}
public static void courtChangeAlert(String alert) throws IOException {
    FXMLLoader fxmlLoader =
        new FXMLLoader(AlertController.class.getResource("/view/CourtChangeAlert.fxml"));
    showScene(fxmlLoader, alert); // line 43
  }

private static void showScene(FXMLLoader fxmlLoader, String alert) throws IOException {
    AnchorPane alertPane = fxmlLoader.load();
    AlertController alertController = fxmlLoader.getController();
    alertController.setAlertLabel(alert);
    Scene scene = new Scene(alertPane);
    Stage stage = new Stage();  // line 51
    stage.setScene(scene);
    stage.show();
  }
倒计时结束后,我收到错误消息:

Exception in thread "Timer-0" java.lang.IllegalStateException: Not on FX application thread; currentThread = Timer-0
    at com.sun.javafx.tk.Toolkit.checkFxUserThread(Toolkit.java:279)
    at com.sun.javafx.tk.quantum.QuantumToolkit.checkFxUserThread(QuantumToolkit.java:423)
    at javafx.stage.Stage.<init>(Stage.java:241)
    at javafx.stage.Stage.<init>(Stage.java:227)
    at controller.AlertController.showScene(AlertController.java:51)
    at controller.AlertController.courtChangeAlert(AlertController.java:43)
    at controller.OptionController$1.run(OptionController.java:56)
    at java.util.TimerThread.mainLoop(Timer.java:555)
    at java.util.TimerThread.run(Timer.java:505)
线程“Timer-0”java.lang.IllegalStateException中的异常:不在FX应用程序线程上;currentThread=Timer-0 在com.sun.javafx.tk.Toolkit.checkFxUserThread(Toolkit.java:279)上 位于com.sun.javafx.tk.quantum.QuantumToolkit.checkFxUserThread(QuantumToolkit.java:423) 在javafx.stage.stage.(stage.java:241) 在javafx.stage.stage.(stage.java:227) 位于controller.AlertController.showsecene(AlertController.java:51) 位于controller.AlertController.courtChangeAlert(AlertController.java:43) 在controller.OptionController$1.run(OptionController.java:56) 位于java.util.TimerThread.mainLoop(Timer.java:555) 在java.util.TimerThread.run(Timer.java:505)
我做错了什么?如何修改代码?提前感谢。

长话短说,计时器()启动一个新进程,无法弹出新窗口。您需要调用以在FX线程中弹出窗口。您必须依次包装函数。

只需包装行
AlertController.courtChangeAlert(“时间到了”)以便它在JavaFX线程上启动

Platform.runLater(()->AlertController.courtChangeAlert("Time's up."));
计时器有自己的线程,当它触发动作时,它会在自己的线程而不是javafx的线程上触发。这就是你所犯的错误