JavaFX Scene Builder - 它是否可用于 Swing 中的 JFXPanel
JavaFX Scene Builder - Is it usable with JFXPanel in Swing
我在带有 JFXPanel 的 Swing 应用程序中使用 JavaFX。我一直在用 css 文件手动编码 JavaFX UI。我正在使用 NetBeans 8.1。
请问,这种情况下,能否使用JavaFX Scene Builder生成UI?据我所知,输出是代表 UI 个组件的 FXML 文件。这与使用 JavaFX 的 JFXPanel 方式兼容吗?
谢谢!
如果您想在 Scene Builder 中管理 JFXPanel
本身和 Swing 组件,那么简短的回答是 "No"。
从纯实用的角度来看,SceneBuilder 不支持 Swing 组件,而这正是您要添加到 JFXPanel
.
中的组件
另一个问题与线程有关。 Scene Builder 只是生成 FXML。 FXML 由 FXMLLoader
通过其 load(...)
方法之一加载。该方法必须在单个线程上执行。如果混合使用 Swing 组件和 JavaFX 组件,您 必须 适当地管理线程,如 JFXPanel
documentation 中所述。由于您无法告诉 FXMLLoader
FXML 的哪些部分在 JavaFX 应用程序线程上处理,哪些部分在 AWT 事件调度线程上处理,因此无法加载描述混合的 FXML 文件遵守这两个工具包的线程规则的 Swing 和 JavaFX 组件。
显然您可以使用 Scene Builder 来管理 JFXPanel
的内容;这与 Scene Builder 的 "regular" 用法相同。同样,Scene Builder 所做的只是生成 FXML,而 FXML 只是对要创建的对象以及它们如何相互关联的描述。所以你可以做
private JFXPanel jfxPanel ;
// build Swing components, initialize jfxPanel, etc
// run on FX Application Thread:
private void initFX() {
FXMLLoader loader = new FXMLLoader(getClass().getResource("/path/to/fxml/file"));
Parent root = loader.load();
Scene scene = new Scene(root);
jfxPanel.setScene(scene);
}
我在带有 JFXPanel 的 Swing 应用程序中使用 JavaFX。我一直在用 css 文件手动编码 JavaFX UI。我正在使用 NetBeans 8.1。
请问,这种情况下,能否使用JavaFX Scene Builder生成UI?据我所知,输出是代表 UI 个组件的 FXML 文件。这与使用 JavaFX 的 JFXPanel 方式兼容吗?
谢谢!
如果您想在 Scene Builder 中管理 JFXPanel
本身和 Swing 组件,那么简短的回答是 "No"。
从纯实用的角度来看,SceneBuilder 不支持 Swing 组件,而这正是您要添加到 JFXPanel
.
另一个问题与线程有关。 Scene Builder 只是生成 FXML。 FXML 由 FXMLLoader
通过其 load(...)
方法之一加载。该方法必须在单个线程上执行。如果混合使用 Swing 组件和 JavaFX 组件,您 必须 适当地管理线程,如 JFXPanel
documentation 中所述。由于您无法告诉 FXMLLoader
FXML 的哪些部分在 JavaFX 应用程序线程上处理,哪些部分在 AWT 事件调度线程上处理,因此无法加载描述混合的 FXML 文件遵守这两个工具包的线程规则的 Swing 和 JavaFX 组件。
显然您可以使用 Scene Builder 来管理 JFXPanel
的内容;这与 Scene Builder 的 "regular" 用法相同。同样,Scene Builder 所做的只是生成 FXML,而 FXML 只是对要创建的对象以及它们如何相互关联的描述。所以你可以做
private JFXPanel jfxPanel ;
// build Swing components, initialize jfxPanel, etc
// run on FX Application Thread:
private void initFX() {
FXMLLoader loader = new FXMLLoader(getClass().getResource("/path/to/fxml/file"));
Parent root = loader.load();
Scene scene = new Scene(root);
jfxPanel.setScene(scene);
}