2014-09-05 79 views
0

我有一個JavaFX控件,基本上是其他幾個JavaFX控件的合併。如何設置將JavaFX控件導入Scene Builder?

我希望它可以導入.jar文件到場景生成器,以便它可以像任何其他控件一樣使用。我能想到的最接近的比喻是,當你在C#中定製控件時,在幾個項目中多次使用它。

當我嘗試導入FXML文件時,它不起作用。該控件不被視爲一個單獨的實體,而是基本上只是它在FXML文件中串聯的所有部分。

我需要怎樣處理FXML文件或controller.java文件,以便場景生成器能夠導入.jar,查看控件並允許導入並使用每個控件自定義控件作爲單個實體?我查了幾個地方,甚至在Stack Overflow之前詢問了一次(儘管我得到的答案不是我正在查找的答案,並且從那時起沒有收到任何答覆),但是我沒有看到任何答案接近處理我的問題。

我來最接近與該線路FXML文件來完成:

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

,但我不知道在/path/to/something

發生的事情,我知道我可以,在初始化,只需將控制權添加到場景中,但這是次優的,而我正在拼命試圖避免的。

+0

你見過這個問題嗎? http:// stackoverflow。com/questions/19342259/how-to-create-multiple-javafx-controllers-with-different-fxml-files Rafael – 2014-09-05 17:58:22

+0

我明白他們在做什麼,從觀察代碼,只要我能告訴唯一的我錯過的是在FXML中聲明控制器(現在我已經通過Scene Builder完成)。 我編譯了.jar,並試圖再次導入它。我什麼也沒得到。它打開了罐子,並沒有給我任何進口。所以雖然這幫助我發現我沒有宣佈控制器,但它仍然無法幫助我解決我的問題。謝謝你。 – Will 2014-09-05 18:28:15

+0

然後,檢查出來 http://stackoverflow.com/questions/16673407/javafx-custom-control-textfield-not-working – 2014-09-05 19:05:03

回答

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

,然後有實際控制類。

因此,對於一個直接的答案,

,你需要有一個類,將被載入你的控制器,你需要從你的控制器向下傳遞給類,它使用您將工作(或者,您可以簡單地將控制器公開並直接訪問它)。

相關問題