在单独的线程中运行JavaFX Controller

时间:2014-01-16 11:39:32

标签: java javafx swt fxml

您好我需要将GUI从SWT升级到JavaFX并在开始时直接遇到问题。 主类继承自Thread,并从某个方法(接口实现)运行:

@Override
public void mStart() {


    this.start();

}

@Override
public void mStop() {

    this.shell.dispose();

}

我的FX GUI是使用SceneBuilder创建的。 问题是如何管理Controller在不同的线程中启动,因为它会自动实例化?

2 个答案:

答案 0 :(得分:3)

经过一番研究后得出的结论是: JavaFX应用程序可以作为非FX应用程序的不同线程运行,只需要实现Runnable并将launch()方法插入run()。然后offcourse在负责启动GUI的线程上执行start()。 然后,如果想要从不同的线程中更新您的控件(按钮,标签,面板等),您必须执行以下操作:

Platform.runLater(new Runnable() {
      @Override public void run() {
        //Update UI here     
      }
    });

了解更多信息阅读帖子: herehere

答案 1 :(得分:1)

好吧,我从未使用过Scene Builder或SWT,但有一点我确定:

JavaFX应用程序线程负责处理任何现有的JavaFX元素。您可以找到有关如何正确处理JavaFX元素here的详细信息。我认为您必须要确保使用JavaFX应用程序线程访问JavaFX元素,您可以使用Platform类中的runLater方法来执行此操作。看看:

http://docs.oracle.com/javafx/2/api/javafx/application/Platform.html#runLater%28java.lang.Runnable%29

与往常一样,我们知道应该从Java程序的主线程启动JavaFX应用程序。您可以做的是在SWT应用程序的任何位置使用主线程来调用主JavaFX类的启动器。例如,在您的SWT应用程序的某一点上,您所要做的就是致电launch

但是,不要忘记,在JavaFX应用程序完成之前,主线程(应该调用launch的线程)将被锁定。

希望这会有所帮助,祝你好运。 :)