加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

OSGi包中的JavaFX样式表

发布时间:2020-12-15 04:15:22 所属栏目:Java 来源:网络整理
导读:我已将“styles.css”放在我的包的根目录中,现在试图弄清楚如何在代码中链接它.问题是@ .getStylesheets().add(_)接受一个String而不是URL,所以我知道的所有方法都失败了: 拿1: scene.getStylesheets().add("styles.css"); → Nov 15,2013 2:04:47 PM com.
我已将“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文件的相对路径引用
> somestyle.css,具有对图像的相对路径引用
> someimage.png
> Resourceloader.java(从css和fxml文件返回URL对象)

Bundle1:

>使用bundle0中的fxml加载器加载fxml的基本javafx文件.

问题:

尽管我在fxml加载器上设置了类加载器,但fxml似乎忽略了所有css和css引用的图像.它只有在我使用css的绝对文件路径和css中引用的图像时才有效.这不是我想要的.

解决方案:

JavaFX中存在2个错误/设计问题,禁止此设置与OSGi一起使用.

>从fxml加载css
>引用来自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并未考虑类加载器或依赖注入.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读