如何从其他线程更改UI

时间:2016-03-14 06:31:43

标签: java javafx

我想在其他线程中更改UI并尝试这种方式 -

Box

但是这段代码不起作用。

3 个答案:

答案 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);