문제

묶음의 루트에 "styles.css"를 배치했으며 이제 코드에서 링크하는 방법을 알아 내려고합니다.문제는 @GetStylesheets ()입니다. add (_) 문자열이 아니라 URL이 아닌 모든 접근 방식이 여기에 실패합니다.

1 :

scene.getStylesheets().add("styles.css");
.

Nov 15, 2013 2:04:47 PM com.sun.javafx.css.StyleManager loadStylesheetUnPrivileged
WARNING: Resource "styles.css" not found.
.

2 :

scene.getStylesheets().add(this.getClass().getResource("styles.css").toExternalForm());
.

NullPointerException
.

3 :

scene.getStylesheets().add(this.getClass().getClassLoader().getResource("styles.css").toExternalForm());
.

Nov 15, 2013 2:27:31 PM com.sun.javafx.css.StyleManager loadStylesheetUnPrivileged
INFO: Could not load stylesheet: bundle://5.0:1/styles.css
.

4 :

scene.getStylesheets().add(myBundle.getEntry("styles.css").toExternalForm());
.

Nov 15, 2013 1:31:35 PM com.sun.javafx.css.StyleManager loadStylesheetUnPrivileged
INFO: Could not load stylesheet: bundle://5.0:0/styles.css
.

felix-4.2.1 , java-8 (빌드 1.8.0-b115) , javafx-8 (8.0.0-EA-B115) .

도움이 되었습니까?

해결책

나는 최근 에이 질문의 원래 포스터와 동일한 오류 / 문제로 실행되었고 CSS / FXML을 변경하거나 TEMP 파일로 추출하지 않고도 해결할 수있었습니다. 나는 여기에 좋은 대답을 찾지 못했을 때 그것을 게시하고 있습니다 :

내 경우 설정은 다음과 같습니다.

번들 0 :

  • someview.fxml CSS 파일에 대한 상대 경로 참조
  • 상대 경로가있는 somestyle.css 이미지에 대한 참조
  • someimage.png
  • ResourceLoader.java (CSS 및 FXML 파일에서 URL 객체를 반환 함)

번들 1 :

  • Bundle0에서 FXML 로더가있는 FXML을로드하는 기본 JavaFX 파일.

문제점 :

모든 CSS 및 CSS 참조 된 이미지는 FXML 로더의 클래스 로더를 설정하더라도 FXML에서 무시 한 것처럼 보였습니다. CSS 및 CSS에서 참조 된 이미지의 절대 파일 경로를 사용한 경우에만 작동합니다. 이것은 내가 원하는 것이 아닙니다.

해결책 :

이 설정이 OSGI 작업을 금지하는 JavaFX에는 2 개의 버그 / 디자인 문제가 있습니다.

  • fxml에서 CSS로드
  • CSS
  • 에서 이미지 참조

첫 번째 문제를 해결하려면 System 속성 Binary.css를 False로 설정하여 JavaFX에서 바이너리 CSS 파일을 비활성화해야합니다. JavaFX에 버그가 있습니다 (어쩌면 이미 수정 되었습니까?) javafx가 Smart를 시도하고 CSS라고해도 BSS 파일을 찾으려고 시도합니다. OSGi Resource URL에는 스키마가 없을 것으로 예상되는 '번들 : //'스키마가 있기 때문에 뒤집습니다. 해결책 :

  • -dbinary.css= false

두 번째 문제를 해결하려면 CSS 이미지가있는 번들의 클래스 로더에 스레드 컨텍스트 클래스 로더를 설정 한 다음 스레드 컨텍스트 클래스 로더를 복원해야합니다. 이 트릭은 CSS가 JavaFX에 의해 해석 될 때마다이를 수행하는 것입니다. 이는 항상 기대할 때 항상 아닙니다 ...

ClassLoader tccl = Thread.currentThread().getContextClassLoader();
        try {
            final ClassLoader resourcesClassLoader = Resourceloader.class.getClassLoader();
        //needed for css
        Thread.currentThread().setContextClassLoader(resourcesClassLoader);
        this.primaryStage.show();
    } finally {
        Thread.currentThread().setContextClassLoader(tccl);
    }
.

불행히도 이것은 내가 일어날 수있는 최상의 솔루션입니다. 모든 기업 응용 프로그램이 일부 형식의 기능을 사용하는 경우에도 JavaFX는 클래스 로더 또는 종속성 주입으로 이루어지지 않았습니다. : (

)

// edit. 스레드 컨텍스트 클래스 로더를 설정하여 CSS에서 이미지에 액세스 할 필요가없는 것처럼 보입니다!

다른 팁

이유가 작동하지 않는 이유는 여기에 설명되어 있습니다./ a> Ressource의 "Externalform"을 사용할 수 없으므로 입력 스트림을 직접 읽어 온도계 파일에 복사했습니다.

        InputStream inputStream = MainApp.class.getResourceAsStream("/styles/styles.css");
        File tempStyleSheetDest = File.createTempFile("javafx_stylesheet", "");
        tempStyleSheetDest.deleteOnExit();
        Files.copy(inputStream, tempStyleSheetDest.toPath(), StandardCopyOption.REPLACE_EXISTING);
        scene.getStylesheets().add(tempStyleSheetDest.toURI().toString());
.

나는 이것이 당신을 돕기를 바랍니다.

조나단

  • CSS 파일
  • 가 포함 된 번들에 액세스 할 수있는 클래스의 클래스 클래스를 사용하고 있는지 확인하십시오.
  • 상대 경로를 사용하는 경우 CSS가 해당 클래스 '패키지
  • 에 상대적인 지 확인하십시오.

여기에 "nofollow"> drombler fx 에 css 파일을로드하는 방법입니다. ( Drombler FX는 OSGi 및 Maven을 기반으로하는 JavaFX를위한 모듈 식 리치 클라이언트 플랫폼입니다.(POM-first) ) :

http://sourceforge.net/p/drombler/drombler-fx/ci/default/tree/drombler-fx-core-docking/src/주 / Java / ORG / DROMBLLE / FX / 코어 / 도킹 / 표시 / 스킨 / 스타일 시트 .JAVA

여기 : 스타일 시트 클래스는 CSS 파일과 동일한 번들에 있습니다.

getClass (). getClassLoader (). getResource (). toexternalform ()?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top