2016-09-01 196 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(...)'使它更清晰*爲什麼這個工作。 –