2013-10-26 3 views
18

javafx GUI 응용 프로그램을 만들고 프로젝트가 maven 구성된 프로젝트입니다. 내 main.fxml 파일은 src/main/resources 폴더에있는 내 컨트롤러가 SRC/메인/자바에 있습니다리소스 폴더에서 javafx fxml 파일을 참조하는 방법은 무엇입니까?

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

: 내 컨트롤러에서 다음과 같이 내 fxml 파일을 참조 할 수 있도록하려면 폴더. 어떻게해야합니까? 내 src/main/resources 폴더가 빌드 경로에 있고 src/main/java 폴더의 클래스에서 src/main/resources 폴더에있는 .properties 파일을 호출 할 수 있습니다.

enter image description here

을하지만 난 여전히 오류가 발생했습니다 :

편집 나는 주요 자원 폴더의 해당 디렉토리에 fxml 파일을 배치하려고했습니다.

답변

57

사용 예제

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

위치 해상도 옵션

  1. 는 src/main/resources 디렉토리에 fxml을 모두 넣습니다.

    loader.setLocation(getClass().getResource("/main.fxml")); 
    
  2. 은 SRC/메인/자원/fxml 디렉토리에 fxml을 모두 넣습니다.

    loader.setLocation(getClass().getResource("/fxml/main.fxml")); 
    
  3. fxml을 해당 자원 디렉토리에 넣습니다. 예 : src/main/resources/com/mycompany/myapp.

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

마지막 옵션은 fxml를로드되는 클래스에 대응하는 Java 소스 계층 구조에서 동일한 상대 위치에 있다고 가정합니다. 예를 들어, 소스 com.mycompany.myapp.Main.java에서 마지막로드 명령을 호출 할 수 있습니다.

FXMLLoader 사용 권장

  1. 오히려 static methods on the FXMLLoader 를 사용하는 것보다 new FXMLLoader() 통해 FXMLLoader의 인스턴스. 당신이 로더에서 get values에 (인스턴스화 컨트롤러 등) 할 때

    • 정적 방법은 혼동 될 .
  2. 인스턴스화 FXMLLoader에 Set the locationload()보다는 스트림에서로드가 load(stream)를 사용하여 호출합니다.로더의 URL을 기반으로 위치를 설정

    • 는 fxml과 CSS 파일에로드 상대 자원의 해결을 위해 수 있습니다. 상대 리소스가 스트림 기반 생성자에 대해 확인되지 않습니다. getClass().getResource()을 사용하여이 URL 기반으로
  3. 기반 스트림이 아닌 getClass().getResourceAsStream() 인, 클래스를 기반으로 위치를 도출합니다.

IDE 및 빌드 설정

는 IDE 도구가 빌드 출력 디렉토리에 자원 디렉토리에서 fxml 파일을 복사하는 짓거나 있는지 확인합니다. Intellij 설정에 대한 자세한 내용은 How to convert a normal java project in intellij into a JavaFx project을 참조하십시오.

+0

귀하의 예제에서 여전히 정적 방법을 사용하고 있습니다. getResource 대신 getResourceAsStream을 호출해야합니다. –

+2

Thanks 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 파일과 다른 패키지에 배치됩니다.