O que há de errado com minha sintaxe ao chamar uma folha de estilo (css) de um arquivo FXML?
Pergunta
Estou trabalhando no NetBeans 8, com Java 8/JavaFX e FXML.
No primeiro controlador (um AnchorPane) do meu documento FXML, tenho isto, que funciona:
stylesheets="file:///C:/Users/me/Documents/NetBeansProjects/MyApp/src/myApp/myStyle.css"
No entanto, quando tento substituir isso por qualquer tipo de caminho relativo, recebo o seguinte erro em tempo de execução:
com.sun.javafx.css.StyleManager loadStylesheetUnPrivileged
WARNING: Resource "myStyle.css" not found.
tentei
stylesheets="myStyle.css"
stylesheets="file://myStyle.css"
stylesheets="./myStyle.css"
stylesheets="css/myStyle.css"
(onde coloquei uma cópia do arquivo css em um subdiretório de onde estava)
...e talvez 50 outras permutações.Toda vez que recebo o mesmo erro.
A razão pela qual me importo é que estou tendo um segundo problema.Na primeira versão, isso funciona na minha máquina...quando levo meu arquivo jar para outra máquina, o css não é aplicado quando a aplicação é executada...É como se o arquivo de recurso não fosse copiado.
Ajuda?
Obrigado!
-Adeena
Solução
Deixe-me considerar a estrutura do seu projeto da seguinte forma
MyApp
|
|_ src
|
|_controllers (Controllers)
|_view (FXML)
|_style (css)
|_myStyle.css
Você pode especificar o caminho relativo no FXML usando
<stylesheets>
<URL value="@../style/myStyle.css" />
</stylesheets>
No seu controlador, você pode adicioná-lo da seguinte maneira
layout.getStylesheets().add(getClass().
getResource("/style/myStyle.css")).toExternalForm();
Outras dicas
É assim que funciona para mim:
<?import java.net.*?>
<fx:root type="javafx.scene.layout.BorderPane" ... xmlns:fx="http://javafx.com/fxml">
<stylesheets>
<URL value="@myStyle.css" />
</stylesheets>
</fx:root>
O arquivo css está no mesmo pacote (pasta) que o FXML.Além disso, minha raiz é <fx:root>
, espero que funcione da mesma forma para o seu <AnchorPane>
.
Confira a documentos, pesquise "Resolução de localização" para obter detalhes.