2

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

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

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

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

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

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

4

1 回答 1

0

一个叫大卫的人确实在论坛上回答了你的问题。出于遗留目的,我将其发布在这里。

Scene 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 中很重要:您不能将它放在外部 jar 中(至少目前如此)。

于 2013-09-03T08:46:27.540 回答