簡體   English   中英

如何設置要導入到Scene Builder中的JavaFX控件?

[英]How do I set up a JavaFX Control to be imported into Scene Builder?

我有一個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

我知道我可以在初始化中簡單地將控件添加到場景中,但這是次優的,我非常想避免。

我終於能夠解決問題。 經過大量的試驗和錯誤並遵循此處的示例代碼,我發現我的問題是每個FXML控件組需要2個類。 一個是該組的實際控制者,另一個是將容納該控制器的對象。 我遵循了Unlock示例中的代碼,這對幫助我真是天賜良機。 基本上,它分為兩個文件:

對象(在我的例子中,它擴展了根節點的類型):

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類。

因此,對於一個簡單的答案,

您需要有一個將加載控制器的類,並且需要從控制器傳遞到將要使用的類(或者,您可以簡單地將控制器公開並直接訪問它)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM