未找到JavaFX FXMLloader资源

时间:2016-09-01 01:08:01

标签: javafx

在提出问题之前需要注意的一些事项。我看过一些关于如何将数据从一个控制器传递到另一个控制器的youtube视频和博客,我假设你必须使用.openStream()才能这样做,如果不是它会破坏我的应用程序。所以我试图将一个字符串传递给我的另一个控制器,如下所示,但在此之前,除了不使用openStream()之外,使用相同的确切代码不会返回任何错误。

然而,在使用.openStream()后,我收到以下错误

Caused by: java.lang.IllegalArgumentException: Invalid URL: Invalid URL or resource not found

导致错误的方法

private void setupFXMLloader() throws IOException{
        //Set up FXMLloaders
        FXMLLoader loader = new FXMLLoader();
        Parent root = loader.load(getClass().getResource("/smartcal/home/Home.fxml").openStream());
        //Get an instance of the home controller
        HomeController homeController =  loader.getController();
        homeController.initUserSettingsButton(email_field.getText());
        //This method would take a user email and
        //parse it to match database to be loaded onto the calendar
//        homeController.updateCalendarHome();

        //Create a new scene and add css file to it
        Scene scene = new Scene(root);
//        scene.getStylesheets().add(getClass().getResource("customfile.css").toExternalForm());
        primaryStage.setScene(scene);
        primaryStage.show();
    }

enter image description here

1 个答案:

答案 0 :(得分:3)

FXMLLoader.load(URL)方法是static方法:因此,如果您使用该方法,它会绕过您完全创建的FXMLLoader 实例,因此控制器不会在该实例上设置属性。因此,如果您使用该方法,getController()将返回null

另一方面,如果将流传递给FXMLLoader.load(InputStream)实例方法,则不会设置FXMLLoader实例的location属性。因此,某些功能(您可能需要或可能不需要;您没有发布FXML或控制器代码),例如location resolution将无法使用。

使用FXMLLoader的最可靠方法是设置位置(作为URL),然后在load()上调用无参数FXMLLoader方法实例:

private void setupFXMLloader() throws IOException{
    //Set up FXMLloaders
    FXMLLoader loader = new FXMLLoader();
    loader.setLocation(getClass().getResource("/smartcal/home/Home.fxml"));
    Parent root = loader.load();
    //Get an instance of the home controller
    HomeController homeController =  loader.getController();
    homeController.initUserSettingsButton(email_field.getText());

    // ...
}