Swing到JavaFX2.0

时间:2014-12-18 19:19:45

标签: javafx

我正在从Swing转向JavaFX2.0。我有一个内部服务与各种JFrame窗口,以显示/更改内部参数。我有一个带按钮的菜单。每个按钮都会启动一个JFrame窗口:

new ASvr().setVisible(true);

工作正常。现在转到JavaFX2.0:每个“窗口”都是一个独立的FXML应用程序。当服务远程使用RPC与服务通信时,独立的FXML应用程序作为独立应用程序运行。这是内部版本,其中“windows”是同一JVM的一部分。

菜单以application.launch()开头。 JVM中只能有一个launch(),所以我不能将launch()用于独立的FXML应用程序。经过多次尝试和错误(主要是错误)后,我想出的是:

new ASvr().start(new Stage());

我认为工作正常。由于我是JavaFX的新手,我可能会遗漏一些会毁掉这个解决方案的东西。自己调用start(),而不是从launch()调用,可能会产生令人讨厌的副作用。我不能使用新的ProcessBuilder并将每个应用程序放在一个新的JVM中,因为我需要直接访问内部服务中的引用。

我的问题:是否有一种首选的方法可以让多个独立的(需要独立运行而不需要更改)在JVM中运行的FXML应用程序场景?您是否看到我所做的任何潜在问题?

1 个答案:

答案 0 :(得分:0)

我不建议您自己拨打start(...)launch(...)方法执行大量复杂的内务处理,例如启动FX工具包和FX应用程序线程,实例化应用程序类,然后在FX应用程序线程上调用start(...)

您基本上应该将start(...)视为JavaFX应用程序的main(...)方法的等效项,将Application子类视为" main-class",不是JFrame子类。 (实际上,在Java 8中,如果您的类是Application的子类,它可以由JVM直接启动,甚至没有main(...)方法。)

创建单个start(...)方法后(再次将其视为"常规" Java应用程序)中单个main(...)入口点的替代品,然后你可以用成语

显示FXML文件的内容
Stage stage = new Stage();
stage.setScene(new Scene(FXMLLoader.load(fxmlResource));
stage.show();

(当然,这方面有一些变化,特别是如果你需要访问控制器,但你明白了。)

如果你想创建Stage的子类,你可以创建JFrame子类的旧样式,并让Stage子类的构造函数加载它的FXML并设置它自己的子类现场。然后你可以使用与Swing中使用的基本相同的习语:

new MyStageSubclass().show();

再次注意JFrame子类的类似物是Stage子类,而不是Application子类。