Javafx 2 在Scenebuilder中使用分层自定义JavaFx组件进行类路径解析

Javafx 2 在Scenebuilder中使用分层自定义JavaFx组件进行类路径解析,javafx-2,fxml,scenebuilder,Javafx 2,Fxml,Scenebuilder,我正在使用FXML创建自定义组件。自定义组件以分层方式设计 当我设计一个使用另一个自定义组件a的自定义组件B时,scenebuilder中会弹出一个类路径问题对话框,我只需通过设置适当的类路径来解决这个问题 然而,当我创建三个组件时,比如说C包含B包含A,并尝试在Scenebuilder中打开顶级组件C时,它失败了。它要求我适当地指定类路径。它找到了B,但没有找到A 类路径、FXML和代码是正确的,因为应用程序能够正确执行。只有Scenebuilder有问题 如何使用Scenebuilder打开

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

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

然而,当我创建三个组件时,比如说C包含B包含A,并尝试在Scenebuilder中打开顶级组件C时,它失败了。它要求我适当地指定类路径。它找到了B,但没有找到A

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

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


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

有人在论坛上回答了你的问题。 出于遗产的目的,我把它贴在这里

场景生成器中自定义组件的类加载器存在问题。 在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中(至少现在是这样)。

有人在论坛上回答了您的问题。 出于遗产的目的,我把它贴在这里

场景生成器中自定义组件的类加载器存在问题。 在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中(至少现在是这样)。

FYI我使用的是Java 7 update 8。我建议用SceneBuilder(DTL)项目来创建。这个论坛帖子的副本也是我写的。我认为只有这个网站上的问题才有资格成为重复问题仅供参考,我正在使用Java 7 update 8。我建议根据SceneBuilder(DTL)项目创建。我也会复制该论坛帖子。我认为只有这个网站上的问题才有资格成为重复问题