我想在其他线程中更改UI并尝试这种方式 -
Box
但是这段代码不起作用。
答案 0 :(得分:3)
在JavaFX应用程序线程上运行某些东西的基本工具是Platform.runLater()。但是,根据您的意见,您似乎也希望在延迟之后在JavaFX应用程序线程上运行某些东西,这就是这个答案所解决的问题。
下面的代码将安排在5秒延迟后在JavaFX应用程序线程上执行某些操作:
Platform.runLater(() -> {
PauseTransition pause = new PauseTransition(Duration.seconds(5));
pause.setOnFinished(event -> doSomething());
pause.play();
});
在你的情况下,doSomething()是:
lblToast.setText(6+"");
这类似于以下解决方案:
PauseTransition相对于ScheduledExecutorService的使用(次要)优点是转换不需要额外的线程。缺点是ScheduledExecutorService返回ScheduledFuture,这可能会让您对进程有更多的控制,因为您可以在ScheduledFuture上调用cancel()或isDone()等方法(虽然额外的控件可能对您的应用程序不重要)。
答案 1 :(得分:2)
ScheduledExecutorService.schedule()允许在指定的延迟后执行任务。
Platform.runLater()在JavaFX-Thread上执行Runnable
。
ScheduledExecutorService ex = Executors.newSingleThreadScheduledExecutor();
Runnable setLabelOnUI = () -> Platform.runLater(() -> lblToast.setText(6+""));
ex.schedule(setLabelOnUI, 5000, TimeUnit.MILLISECONDS);
答案 2 :(得分:-2)
编辑:确保标签变量是静态的,以便Runnable Thread可以访问它! 下面是语法:
Runnable displayRunnable = new Runnable(){
@Override
public void run(){
//Enter Code to Change UI here!
}
};
//Display Runnable allows us to modify UI components
Display.getDefault().syncExec(displayRunnable);