2014-09-26 120 views
1

我有兩個JavaFX項目。JavaFX與其他JavaFX項目部署

  • 子項目:帶標籤的AnchorPane。 (和一個控制器連接到 它)
  • 主項目:AnchorPane帶按鈕。你點擊它,它會彈出一個帶有子項目的新窗口。

所以子項目和主項目都有自己的fxml文件和控制器。

當我使用NetBeans編譯主項目時,它工作得很好。 但是,一旦我將主項目部署到其他計算機,它給了我一個錯誤消息「系統找不到指定的文件」

我認爲問題是,我使用絕對路徑的子項目的fxml位置時,我彈出打開 子窗口。我一直試圖從外部庫中獲取Jar文件中的fxml路徑,但我找不到任何解決方案。任何人都可以幫助我嗎?

這裏是我的代碼在 主項目的控制器

@FXML 
private void handleButtonAction() throws IOException() { 
    FXMLLoader loader = new FXMLLoader(new File("D:/SubProjAddress/SubProject.fxml").toURI().toURL()); 
    Parent root = (Parent)loader.load(); 
    Scene scene = new Scene(root); 
    Stage stage = new Stage(); 
    stage.setScene(scene); 
    stage.show(); 
} 

我使用Java 8上,NetBeans打開一個新的子項目窗口。 預先感謝您

+0

我發現一個Oracle網頁「5.8.3打包複雜應用程序」,它說:「對於雙擊JAR文件,請考慮將所有內容重新打包成單個巨型JAR文件,並從JAR內部加載本機庫和數據文件。 「但是,我不知道它是什麼意思.. – user2932011 2014-09-26 12:21:02

+0

'新文件(「D:/SubProjAddress/SubProject.fxml」)'是fxml的絕對路徑。你需要使用相對路徑。 – ItachiUchiha 2014-09-26 12:42:10

+0

我試過(「../SubProjAddress/SubProject.fxml」),但它只能使用netbeans編譯器 – user2932011 2014-09-26 13:01:33

回答

0

我發現問題的解決方案,所以我把它發佈在這裏供將來參考。

如果您的MainProject包含SubProject,並且要將SubProject的fxml加載到MainProject,則需要從SubProject的.jar文件加載SubProject的fxml。 上面的代碼看起來像從你的src文件中加載SubProject的fxml,而不是.jar文件,並且這導致了問題。

要從jar文件加載fxml文件,只需使用Class.getResource()而不是上面的代碼即可。

例如,

FXMLLoader loader = new FXMLLoader(new File("D:/SubProjAddress/SubProject.fxml").toURI().toURL()); 
Parent root = (Parent)loader.load(); 

成爲

Parent root = FXMLLoader.load(getClass().getResource("/subpackage/SubProject.fxml")); 

利用這一點,我可以部署包含多個項目的,沒有任何問題,我的應用程序。