2012-08-29 51 views
2

我使用FXML創建自定義組件。自定義組件是以分層方式設計的。Scenebuilder中的分層定製JavaFx組件的類路徑解析

當我設計一個使用其他自定義組件有一個自定義組件B,A類路徑問題對話框中scenebuilder彈出,我只是通過設置相應的類路徑解決這個問題。

然而,當我創建三個組成部分,說含含有C A B,並嘗試打開Scenebuilder失敗頂級組件℃。它向我請求我正式指定的類路徑。它發現B,而沒有找到A.

類路徑,FXML和代碼是正確的,因爲應用程序能夠正確執行。只有Scenebuilder有問題。

應該如何打開分層自定義組件與Scenebuilder?

任何參考與使用FXML分級部件定義的示例,將不勝感激並獲得50分獎金。 (只需要3個級別)

+0

FYI我正在使用Java 7更新8. –

+0

我建議針對SceneBuilder(DTL)項目創建[jira問題](http://javafx-jira.kenai.com/browse/DTL)。 – jewelsea

+0

[此論壇帖子]的副本(https://forums.oracle.com/forums/thread.jspa?threadID=2433150)。 – jewelsea

回答

0

有人叫David在論壇上回答了你的問題。 爲了遺留的目的,我在這裏發佈。

Scene Builder中的類加載器存在自定義組件的問題。 當您在SceneBuilder中加載FXML文件時:它使用帶有自己的類加載器的FXMLLoader。 爲了加載使用自己的FXMLLoader加載其他自定義組件的自定義組件,有必要讓所有FXMLLoader使用相同的類加載器。 正如David在論壇上所說的那樣,您可以通過在自定義組件中添加此代碼來實現此目的。

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(至少目前如此)。