概述
问题是您试图关闭
Stage
从一根线
其他
而不是javafx应用程序线程。查看的文档
舞台
你会看到:
stage对象必须在javafx上构造和修改
应用程序线程。
javafx应用程序线程是作为启动的一部分创建的
JavaFX运行时的进程。查看应用程序类和
有关详细信息,请使用platform.startup(runnable)方法。
然而
Service
,启动时将执行
Task
在一个
背景
线。具体来说,
call()
方法
任务
在所述后台线程上执行。我刚试着关闭一个
舞台
在后台线程上查看发生了什么(是否引发异常)。结果是
java.lang.IllegalStateException: Not on FX application thread; currentThread = Thread-3
是的。
你没有看到这个是因为你没有观察到
服务
因为失败。你可以看看
the answer to this question
去寻找观察失败的方法。答案特别提到
任务
但同样的行为也出现在
服务
是的。
要使代码正常工作,需要确保
close()
在javafx应用程序线程上调用。最简单的方法就是
关闭()
在一个
Platform.runLater(Runnable)
打电话来。
Service cicle = new Service() {
@Override
protected Task createTask() {
return new Task() {
volatile boolean waiting = false;
@Override
protected Void call() throws Exception {
Timer.start();
while (Timer.update() / 1000 < time) {
System.out.println(Timer.update())
}
Platform.runLater(() -> close()); // wrapped in Platform#runLater
return null;
}
};
}
};
你也可以重写
Service.succeeded()
它将始终在javafx应用程序线程上调用(但仅当
服务
成功)。在这种情况下,您将删除对
关闭()
从
呼叫()
方法。
Service cicle = new Service() {
@Override
protected Task createTask() {
return new Task() {
volatile boolean waiting = false;
@Override
protected Void call() throws Exception {
Timer.start();
while (Timer.update() / 1000 < time) {
System.out.println(Timer.update())
}
return null;
}
};
}
@Override
protected void succeeded() {
close();
}
};
还有其他的方法:听
state
属性,使用
setOnSucceeded(EventHandler)
等等……
最后
以上就是慈祥抽屉为你收集整理的java关闭stage,stage.close()不工作javafx的全部内容,希望文章能够帮你解决java关闭stage,stage.close()不工作javafx所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复