Pregunta

He colocado "styles.css" en la raíz de mi paquete, y ahora tratando de averiguar cómo vincularlo en el código.El problema es que @ .getstylesheetsheets (). Agregar (_) toma una cadena y no la URL, por lo que todos los enfoques que conozco están fallando aquí:

Tomar 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.

Tomar 2:

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

NullPointerException

tome 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

Tomar 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

Estoy usando felix-4.2.1 , java-8 (construir 1.8.0-ea-b115) , javafx-8 (8.0.0-EA-B115) .

¿Fue útil?

Solución

Recientemente corrí en el mismo error / problemas que el póster original de esta pregunta y yo logré resolverlo sin realizar ningún cambio en el CSS / FXML o extraerlo a un archivo temporal. Lo estoy publicando aquí, ya que no encontré ninguna buena respuesta en línea:

En mi caso, la configuración fue:

paquete0:

  • someView.fxml con una ruta relativa Referencia a un archivo CSS
  • somestyle.css con referencias de ruta relativa a las imágenes
  • sayimage.png
  • ResourceAader.Java (devuelve objetos URL de archivos CSS y FXML)

paquete1:

  • archivos Javafx básicos para cargar el FXML con un cargador FXML de BUNDLE0.

El problema:

Todas las imágenes de CSS y CSS referenciadas parecían ser ignoradas por el FXML, aunque configuré el cargador de clases en el cargador FXML. Solo funcionó si usaba una ruta de archivo absoluta para las CSS y las imágenes referenciadas en el CSS. Esto no es lo que quiero.

La solución:

Hay 2 errores / problemas de diseño en Javafx que prohíben esta configuración de trabajar con OSGI.

  • cargando el CSS de FXML
  • Referencias de imágenes de un CSS

Para solucionar el primer problema, debe deshabilitar el archivo CSS binario en Javafx configurando la propiedad del sistema Binary.css to False. Hay un error en Javafx (¡tal vez ya está arreglado?) Donde Javafx intenta ser inteligente e intenta encontrar el archivo BSS, a pesar de que dice CSS. Se voltea porque las URL de recursos OSGI tienen un esquema de 'paquete: //' donde no espera ningún esquema. Solución:

  • -dbinary.css= falso

Para solucionar el segundo problema, debe configurar el Classloader del contexto del hilo en el Classloader del paquete donde se ubican las imágenes CSS y luego restaure el Classloader del contexto del hilo. El truco es hacer esto cada vez que Javafx interpreta el CSS, que no siempre es cuando espera que sea ...

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);
    }

Desafortunadamente, esta es la mejor solución que podría llegar. Javafx no se hizo con la cargadora de clase o la inyección de dependencia en mente, aunque casi todas las aplicaciones corporativas usen esas funcionalidades de alguna forma. : (

// editar ¡Parece que no necesita configurar el Classloader del contexto del hilo para acceder a las imágenes desde el CSS!

Otros consejos

La razón por la que esto no funciona se explica aquí: javafx jira rt-14177 . Dado que no puede usar la "forma externa "de un RESSOORCE, lo copié en un archivo temporal al leer directamente el flujo de entrada.

        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());

Espero que esto te ayude.

jonathan

  • Asegúrese de que está usando el cargador de clases de una clase que tiene acceso al paquete que contiene el archivo CSS
  • Si está utilizando una ruta relativa, asegúrese de que CSS esté ubicado en relación con el paquete de esa clase

Aquí hay una muestra de cómo he cargado un archivo CSS en drombler fx ( Drombler FX es una plataforma de cliente de Rich Modular para Javafx basado en OSGI y Maven(POM-PRIMERO) ):

http://sourceforge.net/p/drombler/drombler-fx/ci/default/tree/drombler-fx-core-docking/src/PRINCIPAL / JAVA / ORG / DROMBLER / FX / CORE / DOCKING / INPL / SKIN / STYLESHEETS.JAVA

Aquí: la clase de hojas de estilo está en el mismo paquete que el archivo CSS.

getClass (). GetClassloader (). GetReSource (). ToExternalForm ()?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top