我在 Swing 应用程序中使用 JavaFX 和 JFXPanel。我一直在使用 css 文件手动编写 JavaFX UI。我正在使用 NetBeans 8.1。
我想知道,在这种情况下,我可以使用 JavaFX Scene Builder 生成 UI 吗?AFAIK,输出是代表 UI 组件的 FXML 文件。这与使用 JavaFX 的 JFXPanel 方式兼容吗?
谢谢!
我在 Swing 应用程序中使用 JavaFX 和 JFXPanel。我一直在使用 css 文件手动编写 JavaFX UI。我正在使用 NetBeans 8.1。
我想知道,在这种情况下,我可以使用 JavaFX Scene Builder 生成 UI 吗?AFAIK,输出是代表 UI 组件的 FXML 文件。这与使用 JavaFX 的 JFXPanel 方式兼容吗?
谢谢!
如果您想JFXPanel
在 Scene Builder 中管理自身和 Swing 组件,那么简短的回答是“否”。
从纯粹实用的角度来看,SceneBuilder 不支持 Swing 组件,这是您将要添加到JFXPanel
.
另一个问题与线程有关。Scene Builder 只生成 FXML。FXMLFXMLLoader
通过其load(...)
方法之一加载。该方法必须在单个线程上执行。如果您混合使用 Swing 组件和 JavaFX 组件,则必须按照JFXPanel
文档中的说明适当地管理线程。由于您无法告诉在FXMLLoader
JavaFX 应用程序线程上处理 FXML 的哪些部分,以及在 AWT 事件调度线程上处理哪些部分,因此无法加载描述 Swing 和 JavaFX 组件混合的 FXML 文件这符合两个工具包的线程规则。
显然,您可以使用 Scene Builder 来管理JFXPanel
; 这与 Scene Builder 的“常规”用法相同。同样,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);
}