在Scenebuilder中使用分层自定义JavaFx组件的类路径解析

时间:2012-08-29 14:20:55

标签: javafx-2 fxml scenebuilder

我正在使用FXML创建自定义组件。自定义组件以分层方式设计。

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

但是,当我创建三个组件时,比如包含B的C包含A,并尝试在Scenebuilder中打开顶级组件C,它会失败。它要求我提供我正式指定的类路径。它找到B但没有找到A.

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

如何使用Scenebuilder打开分层自定义组件?

任何对使用FXML的分层组件定义的示例的引用都将非常感激,并获得50分的赏金。 (只需要3个级别)

1 个答案:

答案 0 :(得分:0)

名叫大卫的人确实在论坛上回答了你的问题。 为了传统目的,我在这里发布。

Scene Builder中的类加载器存在自定义组件问题。 在SceneBuilder中加载FXML文件时:它使用带有自己的类加载器的FXMLLoader。 为了加载使用自己的FXMLLoader加载其他自定义组件的自定义组件,必须使所有FXMLLoader使用相同的类加载器。 正如David在论坛上所说,您可以通过在自定义组件中添加此代码来实现这一目标。

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中非常重要:您不能将它放在外部jar中(至少目前为止)。