加载存储在jar文件中的文件

时间:2015-03-18 09:11:34

标签: java javafx javafx-8

我的项目myproject / fxml / myScreen.fxml中有一个FXML文件,我尝试用FXMLLoader加载它:

content.getChildren().setAll(FXMLLoader.load(new URL("myproject/fxml/myScreen.fxml")));

但后来我得到了这个例外,

`java.net.MalformedURLException: no protocol: myproject/fxml/myScreen.fxml`

有人能告诉我哪里错了吗?
谢谢。

3 个答案:

答案 0 :(得分:0)

让你的ClassLoader将它作为一个资源加载(假设jar在你的类路径上/使用与当前类相同的类加载器)并将其作为流提供:

content.getChildren().setAll(FXMLLoader.load(this.getClass().getResourceAsStream("myproject/fxml/myScreen.fxml")));

答案 1 :(得分:0)

您收到错误,因为您尚未在传递给URL()的参数中定义协议

它通常接受HTTP/File地址。如果要加载文件,则需要在字符串中添加file:前缀。

加载您可以使用的本地计算机中存在的文件的正确方法:

FXMLLoader.load(new URL("file://myproject/fxml/myScreen.fxml"));

最佳方式

要加载jar中存在的文件,最好的方法是在FXMLLoader.load()中使用getClass.getResource(PATH_TO_FXML)

由于您直接加载fxml并将其分配给内容,因此您必须使用FXMLLoader的非静态load()

FXMLLoader loader = new FXMLLoader(getClass().getResource("/myproject/fxml/myScreen.fxml"));
content.getChildren().setAll(loader.load());

答案 2 :(得分:0)

根据Oracle文档: Example

public static void main(String[] args) {
    Application.launch(FXMLExample.class, args);
}

@Override
public void start(Stage stage) throws Exception {
    Parent root = FXMLLoader.load(getClass().getResource("fxml_example.fxml"));

    stage.setTitle("FXML Welcome");
    stage.setScene(new Scene(root, 300, 275));
    stage.show();
}