2014-09-24 87 views
2

在java fx控制器中,我有两个版本的代码,当按下按钮时,它只是在标签上设置一个文本(这只是一个示例,但其他任何UI修改可以考虑)...Java FX修改UI组件状态,使用/不使用Platform.runLater

第一版本使用Platform.runLater:

Platform.runLater(() -> { 
    status.setText(""); 
    statusIndicator.setVisible(false); 
}); 

另外一个简单的修改它在普通螺纹:

status.setText(""); 
statusIndicator.setVisible(false); 

两者都是工作非常好,只有我知道迄今为止的差异是将一些runnable传递给Platform.runLater将保持执行的顺序。

有没有其他意义的区别或动机来使用Platform.runLater?

回答

4

JavaFX的具有仅单个UI线程

From Docs

JavaFX的场景图,其表示JavaFX应用程序的图形用户界面 ,不是线程安全和只能是访问 并从UI线程进行修改,也称为JavaFX应用程序 线程

如果您有长时间运行的任务,您需要在后台线程上运行它们,并且在完成此类线程后,您需要将结果更新回UI。在这种情况下,您使用Platform.runlater()包围的更新。使用Platform.runLater将代码包围起来,可以使代码与JavaFX应用程序线程进行通信。

来到你的问题:

是否有任何其他significat差或动机使用Platform.runLater?

我最希望的是已经回答了,我想补充

1。 如果您已经位于JavaFX应用程序线程上,则不必使用Platform.runlater()。

2。由于Platform.runLater() doc

在某个不确定的时间运行在JavaFX应用程序线程指定的Runnable在未来

我们不知道什么时候该更新会发生,这取决于更新的数量等待处理。如果许多更新正在等待在UI线程上处理,则可能需要一些时间(这种情况通常不会发生)

+0

因此,当我在通过UI交互触发的控制器方法时,它是FX线?我很安全,不使用Platform.runlater?在来自控制器的长操作情况下,我需要执行单独的操作并使用Platform.runlater更新ui? – vach 2014-09-24 11:20:21

+1

如果你没有在控制器中创建任何线程,你可以放心不要使用它! – ItachiUchiha 2014-09-24 11:25:18

+0

谢谢...我不知道控制器方法在单个UI线程中运行,现在我将所有长操作移动到异步执行中... – vach 2014-09-24 11:28:07