OSGi包中的JavaFX样式表
我已将“styles.css”放在我的包的根目录中,现在试图弄清楚如何在代码中链接它.问题是@ .getStylesheets().add(_)接受一个String而不是URL,所以我知道的所有方法都失败了:
拿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. 拿2: scene.getStylesheets().add(this.getClass().getResource("styles.css").toExternalForm()); → NullPointerException 拿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 拿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 我使用的是Felix-4.2.1,Java-8(build 1.8.0-ea-b115),JavaFX-8(8.0.0-ea-b115). 解决方法
我最近遇到了与此问题的原始海报相同的错误/问题,我设法解决了它,而没有对css / fxml进行任何更改或将其解压缩到临时文件.我在这里发帖,因为我没有在网上找到任何好的答案:
在我的情况下,设置是: Bundle0: > someview.fxml,带有对css文件的相对路径引用 Bundle1: >使用bundle0中的fxml加载器加载fxml的基本javafx文件. 问题: 尽管我在fxml加载器上设置了类加载器,但fxml似乎忽略了所有css和css引用的图像.它只有在我使用css的绝对文件路径和css中引用的图像时才有效.这不是我想要的. 解决方案: JavaFX中存在2个错误/设计问题,禁止此设置与OSGi一起使用. >从fxml加载css 要解决第一个问题,您必须通过将系统属性binary.css设置为false来禁用javafx中的二进制css文件. javafx中有一个错误(可能它已经修复了吗?),即使你说css,javafx试图变聪明并试图找到bss文件.它会翻转,因为OSGi资源URL有一个’bundle://’架构,它不需要架构.解: > -Dbinary.css = false 要解决第二个问题,您必须将线程上下文类加载器设置为css映像所在的包的类加载器,然后还原线程上下文类加载器.诀窍是每次JavaFX解释css时都这样做,这并不总是在你预期的时候…… 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); } 不幸的是,这是我能想到的最好的解决方案.尽管几乎每个企业应用程序都以某种形式使用这些功能,但JavaFX并未考虑类加载器或依赖注入. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |