Question

J'ai placé des "styles.css" à la racine de mon paquet, et maintenant essayer de comprendre comment faire un lien dans le code.Le problème est que @.getStylesheets().ajouter(_) prend une Chaîne et pas d'URL, de sorte que toutes les méthodes que je connais sont en omettant ici:

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

Prendre 2:

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

NullPointerException

Prendre 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

Prendre 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

Je suis à l'aide d' Felix-4.2.1, Java 8 (version 1.8.0-ea-b115), JavaFX-8 (8.0.0-ea-b115).

Était-ce utile?

La solution

Récemment, j'ai couru dans la même erreur/problèmes comme l'affiche originale de cette question et j'ai réussi à le résoudre, sans aucune modification de la css/fxml ou en l'extrayant d'un fichier temp.Je poste ici car je n'ai pas trouvé de réponse en ligne:

Dans mon cas, l'installation a été:

Bundle0:

  • someview.fxml avec un chemin d'accès relatif référence à un fichier css
  • somestyle.css avec une relative références de chemin vers les images
  • someimage.png
  • Resourceloader.java (renvoie l'URL des objets à partir de css et fxml fichiers)

Bundle1:

  • de base javafx fichiers à charger le fxml avec un fxml chargeur de bundle0.

Le problème:

Tous les css et css images référencées semble être ignoré par le fxml, même si j'ai mis le chargeur de classe sur le fxml chargeur.Il n'a travaillé que si j'ai utilisé le chemin absolu du fichier pour le css et les images référencées dans le css.Ce n'est pas ce que je veux.

La solution:

Il y a 2 bugs/problèmes de conception en JavaFX que d'interdire cette installation de travailler avec OSGi.

  • Chargement de la css de fxml
  • le référencement des images à partir d'un css

Pour résoudre le premier problème, vous devez désactiver binaire fichier css en javafx par le réglage du système de la propriété binaire.css pour de faux.Il y a un bug dans javafx (c'est peut-être déjà fixé?) où javafx essaie d'être intelligent, et essaie de trouver le fichier nfi, même si vous dites css.Elle se retourne parce que OSGi Url de ressource ont un " bundle:// schéma où il ne s'attend à aucun schéma.Solution:

  • -Dbinary.css=false

Pour résoudre le deuxième problème, vous devez définir le contexte du thread chargeur de classe pour le chargeur de classe de l'ensemble où la css, les images sont situés puis restaurer le contexte du thread chargeur de classe.L'astuce est de le faire à chaque fois le css est interprété par JavaFX, qui n'est pas toujours lorsque vous vous attendez à ce qu'il soit...

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

Malheureusement, c'est la meilleure solution je pouvais venir.JavaFX n'a pas été faite avec le chargeur de classes ou d'injection de dépendance à l'esprit, même si à peu près toutes les applications d'entreprise utilise ces fonctionnalités dans une certaine forme.:(

//edit Il semble que vous n'avez pas besoin de définir le contexte du thread chargeur de classe pour accéder aux images de la css!

Autres conseils

La raison pour laquelle cela ne fonctionne pas est expliqué ici: Javafx JIRA RT-14177 . Puisque vous ne pouvez pas utiliser le "externalform" d'une ressource, je l'ai copié dans un fichier temporaire en lisant directement le flux d'entrée directement.

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

J'espère vraiment que cela vous aide à sortir.

Jonathan

  • Assurez-vous que vous utilisez le chargeur de classe d'une classe qui a accès au paquet contenant le fichier CSS
  • Si vous utilisez un chemin relatif, assurez-vous que CSS est situé par rapport à ce package de classe

Voici un exemple de quel que j'ai chargé un fichier CSS dans drombler FX ( drombler FX est une plate-forme client riche modulaire pour JavaFX basé sur Osgi et Maven(POM-premier) ):

http://sourceforge.net/p/drombler/drombler-fx/ci/default/tree/drombler-fx-core-docking/src/Main / Java / Org / Drombler / FX / Core / Docking / Impl / Skin / Styles Sheets.Java

ici: la classe de styleshets est dans le même paquet que le fichier CSS.

getclass (). GetClassloader (). GetResource (). Toexternalform ()?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top