gpt4 book ai didi

JavaFX:无法加载二进制样式表

转载 作者:太空宇宙 更新时间:2023-11-04 11:49:06 25 4
gpt4 key购买 nike

我使用

从我的 css 文件(位于 module/src/main/resources/styles 中)创建了二进制样式表

javapackager -createbss -srcdir 。 -outdir .

根据 this answer以及 this report 中的推荐我用

加载它们

scene.getStylesheets().add("styles/style.css");

并删除了 .css 文件,只是为了测试 JavaFX 确实会查找现有的 .bss 文件,即使它们被引用为 .css。

但是,运行该应用程序会出现以下错误:

2017 年 2 月 3 日下午 3:42:47 com.sun.javafx.css.StyleManager loadStylesheetUnPrivileged
警告:找不到资源“styles/style.css”。

检查 loadStylesheetUnPrivileged() 我可以看到它确实可以找到资源文件夹中的文件并开始读取它们,但在 DataInputStream.readUTF() 中失败并出现 EOFException。然后,正如预期的那样,它尝试查找我删除的 .css 文件,并在明显失败时给出上面的消息。

我正在研究 Java 8u40,但也尝试过 8u112,具有相同的行为。

我应该在 .css 文件中查找是否有任何内容可能导致生成的 .bss 无效?我找不到任何有关该技术限制的文档。

我很乐意提供任何缺失的信息。

更新

我已将 .css 减少到最小,但相应的 .bss 仍然无法读取。这排除了不支持的关键字的问题。作为引用,这里是最小化的 .css:

.button {
-fx-background-color: blue;
}

另一方面,我创建了一个小型测试应用程序(与 the answer mentioned above 中的非常相似)加载转换为 .bss 的相同最小 .css,并且它按预期工作。两者 (8u40) 中使用的 Java 版本相同,javapackager 也相同。测试应用程序:

public class Main extends Application {
@Override
public void start(Stage stage) throws IOException {
FXMLLoader loader = new FXMLLoader(getClass().getResource("/Mainwindow.fxml"));
AnchorPane ap = loader.load();
ap.getStylesheets().add("styles/style.css");

Scene scene = new Scene(ap);
stage.setScene(scene);
stage.show();
}
}

正如预期的那样,生成的二进制文件也是相同的: link to image here, not enough rep to embed :)

我不确定环境中的什么可能导致主应用程序无法加载完全相同的 .bss?

最佳答案

这确实是环境上的差异:当resources插件在构建时将.bss文件从源目录复制到jar或classes文件夹中时,maven会过滤.bss文件。这本质上是破坏了文件。

因此解决方案是在元素的 pom.xml 中添加一个 exclude 子句:

<project>
...
<build>
...
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<excludes>
...
<exclude>**/*.bss</exclude>
...

关于JavaFX:无法加载二进制样式表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42028129/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com