如何设置要导入到场景生成器中的JavaFX控件?

如何设置要导入到场景生成器中的JavaFX控件?,java,custom-controls,javafx-8,scenebuilder,Java,Custom Controls,Javafx 8,Scenebuilder,我有一个JavaFX控件,它基本上是几个其他JavaFX控件的合并 我希望将.jar文件导入到场景生成器中,以便可以像其他控件一样使用它。我能想到的最接近的类比是,当您在C中创建一个自定义控件并在几个项目中多次使用它时 当我尝试导入FXML文件时,它不起作用。控件没有被视为单个实体,而是基本上只是FXML文件中的所有部分 我需要如何处理FXML文件或controller.java文件,以便场景生成器能够导入.jar,查看控件,并允许我将每个自定义控件作为单个实体导入和使用?我看过好几个地方,甚至

我有一个JavaFX控件,它基本上是几个其他JavaFX控件的合并

我希望将.jar文件导入到场景生成器中,以便可以像其他控件一样使用它。我能想到的最接近的类比是,当您在C中创建一个自定义控件并在几个项目中多次使用它时

当我尝试导入FXML文件时,它不起作用。控件没有被视为单个实体,而是基本上只是FXML文件中的所有部分

我需要如何处理FXML文件或controller.java文件,以便场景生成器能够导入.jar,查看控件,并允许我将每个自定义控件作为单个实体导入和使用?我看过好几个地方,甚至曾经问过一次Stack Overflow问题,虽然我得到的答案不是我想要的答案,而且此后也没有收到任何回复,但我所看到的都无法解决我的问题

我最接近的是FXML文件中的这一行:

<?scenebuilder-classpath-element /path/to/something?>
但是我不知道什么进入/路径/到达/某处


我知道,在初始化过程中,我可以简单地将控件添加到场景中,但这是次优的,也是我极力避免的事情。

我终于能够解决这个问题。经过多次尝试和错误,并遵循来自的示例代码,我发现我的问题是每个FXML控制组需要2个类。 一个是组的实际控制器,另一个是容纳控制器的对象。我遵循解锁示例中的代码,这是上天赐予我的帮助。 基本上可以归结为两个文件:

扩展根节点类型的对象,在本例中:

public class <InsertObjectClassNameHere> extends <RootContainerTypeHere>{
}
因此,对我来说,对象类如下所示:

public class DGCSDefiner extends GridPane {
    private final DGCSDefinerController Controller;
    public DGCSDefiner(){
        this.Controller = this.Load();
    }

    private DGCSDefinerController Load(){
        final FXMLLoader loader = new FXMLLoader();
        loader.setRoot(this);
        loader.setClassLoader(this.getClass().getClassLoader());
        loader.setLocation(this.getClass().getResource("DGCSDefiner.fxml"));

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

        final DGCSDefinerController cntrlr = loader.getController();
        assert cntrlr != null;
        return cntrlr;
    }

    /**
     * Get the settings defined by the controller.
     * @return controller defined settings.
     */
    public ColorSettings getColorSettings(){
        return this.Controller.getColorSettings();
    }

    /**
     * Set the controllers color settings.
     * @param CS Defined color settings.
     */
    public void setColorSettings(ColorSettings CS){
        this.Controller.setColorSettings(CS);
    }
}
然后是实际控制器类

因此,对于一个直截了当的答案,
您需要有一个将加载控制器的类,并且您需要从控制器传递到您将使用的类,或者,您可以简单地将控制器公开并直接访问它。

您看到这个问题了吗?RafaelI看到了他们在做什么,从观察代码的角度来看,我唯一错过的就是在FXML中声明控制器,我现在已经通过Scene Builder完成了这项工作。我编译了.jar,并再次尝试导入它。我什么都没有。它打开罐子,没有给我任何东西可以导入。因此,虽然这有助于我发现我没有声明控制器,但它仍然不能帮助我解决问题。谢谢。那么,看看这个
public class DGCSDefiner extends GridPane {
    private final DGCSDefinerController Controller;
    public DGCSDefiner(){
        this.Controller = this.Load();
    }

    private DGCSDefinerController Load(){
        final FXMLLoader loader = new FXMLLoader();
        loader.setRoot(this);
        loader.setClassLoader(this.getClass().getClassLoader());
        loader.setLocation(this.getClass().getResource("DGCSDefiner.fxml"));

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

        final DGCSDefinerController cntrlr = loader.getController();
        assert cntrlr != null;
        return cntrlr;
    }

    /**
     * Get the settings defined by the controller.
     * @return controller defined settings.
     */
    public ColorSettings getColorSettings(){
        return this.Controller.getColorSettings();
    }

    /**
     * Set the controllers color settings.
     * @param CS Defined color settings.
     */
    public void setColorSettings(ColorSettings CS){
        this.Controller.setColorSettings(CS);
    }
}