Classpath的分辨率,在Scenebuilder层次的定制JavaFX组件(Classpath

2019-07-31 06:13发布

我使用FXML创建自定义组件。 自定义组件都设计在一个分层的方式。

当我设计一个使用另一种定义组件有一个自定义组件B,A类路径问题对话框中scenebuilder弹出,我只是通过设置相应的类路径解决这个问题。

然而,当我创建三个组成部分,说含含有C A B,并尝试打开Scenebuilder失败顶级组件℃。 它要求我要我正式指定的类路径。 它发现B,而没有找到A.

类路径,FXML和代码是正确的,因为应用程序能够正确执行。 只有Scenebuilder是有问题的。

一个人应该如何打开分层自定义组件与Scenebuilder?

成使用FXML分级部件定义的示例中的任何参考,将不胜感激并获得50分奖金。 (仅3个级别需要)

Answer 1:

名叫大卫有人做了回答你的问题的论坛。 对于传统的目的,我在这里发布。

有在现场Builder中的类加载器自定义组件有问题。 当您加载SceneBuilder一个FXML文件:它使用其自己的类加载一个FXMLLoader。 为了加载它使用自己的FXMLLoader加载其它自定义组件自定义组件,就必须使所有FXMLLoader使用相同的类加载器。 当大卫在论坛上说,你可以在你的自定义组件添加该代码实现这一目标。

public class CustomC extends VBox {
    public CustomC() {
        init();
    }

    private void init() {
        FXMLLoader loader = new FXMLLoader();
        loader.setRoot(this);
        loader.setLocation(this.getClass().getResource("CustomC.fxml"));

        // Make sure to load "CustomC.fxml" with the same classloader that
        // was used to load CustomC class. 
        loader.setClassLoader(this.getClass().getClassLoader());

        try {
           final Node root = (Node)loader.load();
           assert root == this;
        } catch (IOException ex) {
           throw new IllegalStateException(ex);
        }
    }
}

如果你想在一个类来外部这段代码,它把这个类在同一个罐子为您的自定义组件很重要:你不能把它放在一个外部JAR(至少目前如此)。



文章来源: Classpath resolution with hierarchical custom JavaFx components in Scenebuilder