我是靠谱客的博主 慈祥抽屉,最近开发中收集的这篇文章主要介绍java关闭stage,stage.close()不工作javafx,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

问题是您试图关闭

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所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(60)

评论列表共有 0 条评论

立即
投稿
返回
顶部