2013-10-26 204 views
18

我正在創建一個javafx GUI應用程序,我的項目是一個maven配置項目。我希望能夠引用我FXML文件,這樣在我的控制器:如何在資源文件夾中引用javafx fxml文件?

FXMLLoader.load(getClass().getResource("main.fxml"); 

凡我main.fxml文件位於src /主/資源文件夾,我的控制器是在src/main/java下夾。我如何去做這件事?我的src/main/resources文件夾位於構建路徑中,我可以從src/main/java文件夾中的類中調用src/main/resources文件夾中的.properties文件。

編輯

我試圖將FXML文件放置在主資源文件夾中的相應目錄:

enter image description here

,但我仍然有一個錯誤。

回答

57

用法示例

FXMLLoader loader = new FXMLLoader(); 
loader.setLocation(getClass().getResource("/main.fxml")); 
Parent content = loader.load(); 

位置分辨率選項

  1. 把所有的FXML的在src/main/resources目錄。

    loader.setLocation(getClass().getResource("/main.fxml")); 
    
  2. 將所有的fxml放在src/main/resources/fxml目錄中。

    loader.setLocation(getClass().getResource("/fxml/main.fxml")); 
    
  3. 將fxml放在相應的資源目錄中;例如SRC /主/資源/ COM/myCompany中/ MYAPP。

    loader.setLocation(getClass().getResource("main.fxml")); 
    

最後一個選項假設您要從中加載FXML類是在相應的Java源層次相同的相對位置。例如,您可能會調用來自源com.mycompany.myapp.Main.java的最後一個加載命令。

FXMLLoader使用建議

  1. new FXMLLoader()通過實例化一個FXMLLoader而不是使用 的static methods on the FXMLLoader。當你想get values(如實例 控制器)了裝載機的

    • 靜態方法 變得混亂。
  2. Set the location的實例FXMLLoader並調用 load()而不是使用 load(stream)從流加載。

    • 在加載器上設置一個基於URL的位置允許在fxml和css文件中加載相關資源的分辨率爲 。對於基於流的構造函數,相對 資源無法解析。
  3. 爲了推導基於的類的位置,使用 getClass().getResource(),因爲它是基於URL,而不是 getClass().getResourceAsStream()這是基於流。

IDE和構建設置

確保您的IDE或構建工具是從資源目錄構建輸出目錄複製FXML文件。要了解Intellij的設置,請參閱:How to convert a normal java project in intellij into a JavaFx project

+0

你仍然在你的例子中使用靜態方法。你需要調用getResourceAsStream而不是getResource –

+2

謝謝Felix,修復並澄清了答案。 3年和28個upvotes,之前沒有人在原始答案中指出這種異常;-) – jewelsea

+0

所有這一次,它失敗了,因爲我沒有在開始文件夾之前放置'/'。即'的getClass()。的getResource( 「FXML/main.fxml」)'。 – sudoman

4

您正在使用FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("main.fxml"));加載main.fxml。這需要main.fxml和java類將其加載到相同的目錄/路徑中。 如果您想從與加載它的java類不同的路徑/位置加載fxml文件,則需要使用相對路徑。 正如上面提到的@jewelsea,你可以在main.fxml之前使用/字符的相對路徑。 這樣的代碼,這將使它爲你工作你的情況是

FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/main.fxml")); 
0

在你的操作系統的文件瀏覽器打開你的資源文件夾。在這裏你會看到你已經創建了一個「dominion.application」文件夾,而不是「dominion」文件夾中的「application」文件夾。因此,「MainController」類與fxml文件放在不同的包中。