Pergunta

Eu coloquei "estilos.css" na raiz do meu pacote, e agora tentando descobrir como ligá-lo em código.O problema é que o @.getStylesheets().adicionar(_) leva uma Seqüência de caracteres e não URL, portanto, a todas as abordagens eu sei que estão a falhar aqui:

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

Tomar 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

Eu estou usando Felix-4.2.1, Java-8 (compilação 1.8.0-ea-b115), JavaFX-8 (8.0.0-ea-b115).

Foi útil?

Solução

Eu recentemente fizemos no mesmo erro/problemas como o autor da pergunta, e eu consegui resolvê-lo sem fazer nenhuma alteração no css/fxml ou extrai-lo para um arquivo temporário.Eu estou postando aqui, como eu não encontrar alguma boa resposta on-line:

No meu caso, a instalação foi:

Bundle0:

  • someview.fxml com uma referência de caminho relativo para o arquivo css
  • somestyle.css com o caminho relativo referências a imagens
  • someimage.png
  • Resourceloader.java (retorna o URL de objetos a partir de css e fxml arquivos)

Bundle1:

  • básica javafx arquivos para carregar o fxml com um fxml carregador de bundle0.

O problema:

Todos os css css e imagens referenciadas parecia ser ignorado pelo fxml, apesar de eu definir o carregador de classe no fxml carregador.Ele só funcionava se eu usei um caminho de arquivo absoluto para o css e as imagens referenciadas na css.Não é isso que eu quero.

A solução:

Há 2 bugs/problemas de design, em JavaFX, que proíbem esta configuração de trabalhar com OSGi.

  • Carregar o css do fxml
  • referência de imagens a partir de um css

Para corrigir o primeiro problema, você tem que desativar o binário do arquivo css em javafx, definindo a propriedade do sistema binário.css para false.Há um bug em javafx (talvez ele já está corrigido?) onde javafx tenta ser inteligente e tenta encontrar o bss arquivo, mesmo que você dizer css.Ele vira porque OSGi recurso URLs ter um " bundle://' esquema onde ele espera que nenhum esquema.Solução:

  • -Dbinary.css=false

Para corrigir o problema segundo, você tem que definir o contexto do thread carregador de classe para o carregador de classe do pacote onde o css imagens estão localizados e, em seguida, restaurar o contexto do thread carregador de classe.O truque é fazer isso a cada vez que o css é interpretado pelo JavaFX, o que nem sempre quando você espera que seja...

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

Infelizmente esta é a melhor solução que eu poderia vir acima com.O JavaFX não foi feito com carregador de classe ou de injeção de dependência em mente, mesmo que apenas sobre cada aplicação corporativa usa essas funcionalidades, de alguma forma.:(

//edit Parece que você não precisa para definir o contexto do thread carregador de classe para acesso a imagens do css!

Outras dicas

A razão pela qual isso não funcionar é explicado aqui: javafx jira RT-14177.Desde que você não pode usar o "ExternalForm" de um ressource, copiei-a em um arquivo temporário lendo o fluxo de entrada diretamente.

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

Eu realmente espero que isso ajude você.

Jonathan

  • Certifique-se de que você está usando o carregador de classe de uma classe que tem acesso ao pacote que contém o arquivo css
  • Se você estiver usando um caminho relativo, certifique-se de que a css está localizado em relação a essa classe' pacote

Aqui está um exemplo de como eu tenho carregado um arquivo css em Drombler FX (Drombler FX é um sistema de Plataforma Rich Client para JavaFX baseado em OSGi e Maven (POM-primeiro)):

http://sourceforge.net/p/drombler/drombler-fx/ci/default/tree/drombler-fx-core-docking/src/main/java/org/drombler/fx/core/docking/impl/skin/Stylesheets.java

Aqui:as Folhas de estilo é o de classe no mesmo pacote como o arquivo css.

getClass().getClassloader().getResource().toExternalForm()?

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