O que há de errado com minha sintaxe ao chamar uma folha de estilo (css) de um arquivo FXML?

StackOverflow https://stackoverflow.com//questions/22043650

  •  21-12-2019
  •  | 
  •  

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

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top