我在Swing应用程序中使用JavaFX,使用JFXPanel。我一直用css文件手动编写JavaFX UI。我使用的是NetBeans 8.1。
我想知道,在这种情况下,我可以使用JavaFX Scene Builder来生成UI吗? AFAIK,输出是FXML文件,代表UI组件。这与JFXPanel使用JavaFX的方式兼容吗?
谢谢!
答案 0 :(得分:1)
如果要在Scene Builder中管理JFXPanel
本身和Swing组件,那么简短的回答是“否”。
从纯粹实用的角度来看,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的“常规”用法相同。同样,所有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);
}