Quel est le problème avec ma syntaxe appelant une feuille de style (css) à partir d'un fichier FXML ?
Question
Je travaille sous NetBeans 8, avec Java 8 / JavaFX et FXML.
Dans le premier contrôleur (un AnchorPane) de mon document FXML, j'ai ceci qui fonctionne :
stylesheets="file:///C:/Users/me/Documents/NetBeansProjects/MyApp/src/myApp/myStyle.css"
Cependant, lorsque j'essaie de le remplacer par n'importe quel type de chemin relatif, j'obtiens l'erreur suivante au moment de l'exécution :
com.sun.javafx.css.StyleManager loadStylesheetUnPrivileged
WARNING: Resource "myStyle.css" not found.
J'ai essayé
stylesheets="myStyle.css"
stylesheets="file://myStyle.css"
stylesheets="./myStyle.css"
stylesheets="css/myStyle.css"
(où j'ai mis une copie du fichier CSS dans un sous-répertoire d'où il se trouvait)
... et peut-être 50 autres permutations.Chaque fois, j'obtiens la même erreur.
La raison pour laquelle je m'en soucie est que j'ai un deuxième problème.Dans la première version, cela fonctionne sur ma machine...lorsque j'emporte mon fichier jar sur une autre machine, le CSS n'est pas appliqué lors de l'exécution de l'application...C'est comme si le fichier de ressources n'était pas copié.
Aide?
Merci!
-Adéena
La solution
Permettez-moi de considérer votre structure de projet comme suit
MyApp
|
|_ src
|
|_controllers (Controllers)
|_view (FXML)
|_style (css)
|_myStyle.css
Vous pouvez spécifier le chemin relatif dans la FXML en utilisant
<stylesheets>
<URL value="@../style/myStyle.css" />
</stylesheets>
Dans votre contrôleur, vous pouvez l'ajouter comme suit
layout.getStylesheets().add(getClass().
getResource("/style/myStyle.css")).toExternalForm();
Autres conseils
Voici comment cela fonctionne pour moi :
<?import java.net.*?>
<fx:root type="javafx.scene.layout.BorderPane" ... xmlns:fx="http://javafx.com/fxml">
<stylesheets>
<URL value="@myStyle.css" />
</stylesheets>
</fx:root>
Le fichier CSS se trouve dans le même package (dossier) que FXML.Il se trouve aussi que ma racine est <fx:root>
, je m'attends à ce que cela fonctionne de la même manière pour votre <AnchorPane>
.
Vérifiez documents, recherchez « Résolution de localisation » pour plus de détails.