2016-09-01 157 views
-1

在问我的问题之前需要注意的一些事项。我已经看过一些关于如何将数据从一个控制器传递到另一个控制器的YouTube视频和博客,我假设您必须使用.openStream()才能做到这一点,否则会破坏我的应用程序。所以我正在尝试将一个字符串传递给我的另一个控制器,如下所示,但在此之前,除非不使用openStream(),否则使用相同的确切代码不返回任何错误。JavaFX FXMLloader资源未找到

但是,使用.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

回答

2

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()); 

    // ... 
} 
+0

太谢谢你了!奇迹般有效! –

+0

您可以将URL传递给FXMLLoader的构造函数 – Clayn

+0

@Clayn是,true;我只是想明确调用'setLocation(...)'使它更清晰*为什么这个工作。 –