2013-09-27 4 views
1

JavaFX를 사용하고 CSS 파일을 내 장면으로로드하려고합니다.클래스 경로 외부의 디렉토리에서 리소스를로드 할 때 NPE

scene.getStyleSheets().add(Main.class.getResource("res/application.css").toExternalForm(); 

NPE를 throw합니다. 나는 css 파일이 classpath 안에 있지 않기 때문에 그렇게 생각하고있다.하지만이 방법으로로드하는 방법을 모르겠다. 필자는 패키지 파일 (com.somecompany.package)에 css 파일을 포함하고 싶지 않습니다. 사용자가 원하는대로 수정할 수 있도록 자체 디렉토리에 배포 할 수있는 별도의 디렉토리에 포함하는 것이 좋습니다.

클래스 패스 외부에서 CSS 파일 (또는 관련 리소스)을로드하려면 어떻게해야합니까?

내 스택 추적 :

java.lang.NullPointerException 
     at com.somecompany.someapp.Main.start(Main.java:30) 
     at com.sun.javafx.application.LauncherImpl$5.run(LauncherImpl.java:319) 
     at com.sun.javafx.application.PlatformImpl$5.run(PlatformImpl.java:206) 
     at com.sun.javafx.application.PlatformImpl$4.run(PlatformImpl.java:173) 
     at com.sun.glass.ui.win.WinApplication._runLoop(Native Method) 
     at com.sun.glass.ui.win.WinApplication.access$100(WinApplication.java:29) 
     at com.sun.glass.ui.win.WinApplication$3$1.run(WinApplication.java:73) 
    at java.lang.Thread.run(Unknown Source) 
+0

파일을 찾을 수없는 경우 FileNotFoundException이 발생합니다 ... NPE의 스택 추적을 붙여 넣을 수 있습니까? –

+0

@GV'Class # getResource()'는 자원을 찾지 못하면'null'을 반환합니다. –

+0

스택 추적을 추가했습니다. Main.class의 30 행은 위의 행입니다. @SotiriosDelimanolis는 맞습니다. 찾을 수 없기 때문에 npe입니다. 나는 그것을 찾을 수 있도록 잘 모르겠다 비록 – SnakeDoc

답변

2

당신은

scene.getStyleSheets().add(Main.class.getResource("/res/application.css").toExternalForm(); 

그렇지 않으면 경로가 해결 될 때 클래스 패스의 루트에있는 자원을 검색 할 String 인수의 시작 부분에 /을 추가 할 수 있습니다 Main이있는 패키지를 기준으로합니다. 자원을 해결하는 규칙은 explained in the javadoc입니다.

실제로 파일을 수정하려는 경우 이상적이지 않습니다. 이 경우 파일 시스템에서 파일을 가져와야합니다.

Path path = Paths.get("/path/to/file");  
scene.getStyleSheets().add(path.toUri().toURL()).toExternalForm(); 
+0

내가 그것을 편집 할 수 있도록 (예 2 비교) 할 계획이라면 왜 직접적으로로드하는 것이 이상적이지 않은지 (예 1)에 대해 자세히 설명 할 수 있습니까? – SnakeDoc

+0

@ SnakeDoc 먼저,'URL'에서'OutputStream'을 얻을 수 없습니다 (경로를 가져올 수 있고'File' 또는'Path'를 사용하지만 meh). 둘째,'jar'에서 응용 프로그램을 실행하면 어떻게됩니까? –

+0

흠, 흥미로운 점. jar에서 프로그램을 패키지화 할 계획입니다. 두 번째 예제를 시도해 보겠습니다. – SnakeDoc

관련 문제