在提出问题之前需要注意的一些事项。我看过一些关于如何将数据从一个控制器传递到另一个控制器的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();
}
答案 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());
// ...
}