2014-09-26 85 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")); 

利用这一点,我可以部署包含多个项目的,没有任何问题,我的应用程序。