JavaFX场景生成器 - 它可以在Swing中使用JFXPanel

时间:2016-10-11 06:16:27

标签: javafx-8 netbeans-8 scenebuilder jfxpanel

我在Swing应用程序中使用JavaFX,使用JFXPanel。我一直用css文件手动编写JavaFX UI。我使用的是NetBeans 8.1。

我想知道,在这种情况下,我可以使用JavaFX Scene Builder来生成UI吗? AFAIK,输出是FXML文件,代表UI组件。这与JFXPanel使用JavaFX的方式兼容吗?

谢谢!

1 个答案:

答案 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);
}