在java中,当计时器倒计时结束时,如何创建弹出消息窗口?
当我尝试实现弹出窗口时,我做了如下操作: OptionController中的代码段:在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
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的线程上触发。这就是你所犯的错误