如何设置要导入Scene Builder的JavaFX控件?

时间:2014-09-05 16:00:28

标签: java custom-controls javafx-8 scenebuilder

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

我希望它可以将.jar文件导入到Scene Builder中,以便它可以像任何其他控件一样使用。我能想到的最接近的类比是你在C#中进行自定义控制并在几个项目中多次使用它。

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

我需要对FXML文件或controller.java文件做什么,以便Scene Builder能够导入.jar,查看控件,并允许我导入和使用每个自定义控制为一个单一的实体?我曾经看了好几个地方,甚至曾经问过Stack Overflow曾经问过一次(虽然我得到的答案不是我正在寻找的那个,但之后没有得到任何答复),但我所看到的一切都没有关闭处理我的问题。

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

<?scenebuilder-classpath-element /path/to/something?>

但我不知道/path/to/something

中的内容

我知道我可以在初始化中简单地将控件添加到场景中,但这是次优的并且是我迫切想要避免的。

1 个答案:

答案 0 :(得分:0)

我终于能够解决这个问题了。经过多次试验和错误并遵循here的示例代码后,我发现我的问题是每个FXML控制组需要2个类。 一个是组的实际控制器,另一个是容纳控制器的对象。我按照解锁示例中的代码进行操作,这对于帮助我来说是天赐之物。 基本上它归结为两个文件:

对象(在我的例子中扩展了根节点的类型):

public class <InsertObjectClassNameHere> extends <RootContainerTypeHere>{
}

之后你需要控制器类。这是我最熟悉的,但我仍然做错了。这需要implement initializable

public class <InsertControllerClassNameHere> implements Initializable{

}

对我来说,Object类看起来像这样:

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);
    }
}

然后是实际的Controller类。

所以直截了当的答案

你需要有一个将要加载你的控制器的类,你需要从你的控制器传递到你将使用它的那个类(或者,你可以简单地保持控制器公开并直接访问它)