我正在从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应用程序场景?您是否看到我所做的任何潜在问题?
答案 0 :(得分:0)
我不建议您自己拨打start(...)
。 launch(...)
方法执行大量复杂的内务处理,例如启动FX工具包和FX应用程序线程,实例化应用程序类,然后在FX应用程序线程上调用start(...)
。
您基本上应该将start(...)
视为JavaFX应用程序的main(...)
方法的等效项,将Application
子类视为" main-class",不是JFrame
子类。 (实际上,在Java 8中,如果您的类是Application
的子类,它可以由JVM直接启动,甚至没有main(...)
方法。)
创建单个start(...)
方法后(再次将其视为"常规" Java应用程序)中单个main(...)
入口点的替代品,然后你可以用成语
Stage stage = new Stage();
stage.setScene(new Scene(FXMLLoader.load(fxmlResource));
stage.show();
(当然,这方面有一些变化,特别是如果你需要访问控制器,但你明白了。)
如果你想创建Stage
的子类,你可以创建JFrame
子类的旧样式,并让Stage
子类的构造函数加载它的FXML并设置它自己的子类现场。然后你可以使用与Swing中使用的基本相同的习语:
new MyStageSubclass().show();
再次注意JFrame
子类的类似物是Stage
子类,而不是Application
子类。