java - JavaFX 不显示 JPG 文件
问题描述
出于某种原因,我的应用程序没有在 JavaFX 窗口中显示 JPG 文件。无论我是尝试在 ImageViewer 节点内显示图像还是使用 CSS-fx-background-image: url(...);
属性将其设置为背景,都没有关系。
- 我尝试过使用不同的 jpg 文件。那没起效。
- 我尝试过使用不同的图像扩展名(png、gif)。它确实奏效了。
我正在使用 OpenJDK 16+36(我使用 Hotspot 和 OpenJ9 JVM 进行了测试)、JavaFX 16,我的操作系统是 Linux 5.11.16,我的窗口管理器是 GNOME Shell 3.38.4。
PS:不用说,操作系统处理JPG图像没有任何问题。
什么可能导致这种行为?
编辑1:
对我来说,JavaFX 上没有任何涉及 jpeg 的东西。无论我尝试使用 jpeg 作为背景图像,就像Oracle 的示例,还是在 ImageViewer 中,结果都是一样的(窗口正常打开,就好像我没有放任何图像一样)。如果我用不同的扩展名替换文件,它会完美运行。有趣的是 jpeg 在 Swing 中没有问题。
以下是问题发生的可能情况之一:
/**
* JavaFX Application
*/
@Override
public void start(Stage primaryStage) throws Exception {
// opens a window with the image without issue and prints true
var fileUrl = getClass().getResource("/freemind.png");
var image = new Image(fileUrl.toExternalForm());
var imageViewer = new ImageView(image);
var vbox = new VBox(imageViewer);
var scene = new Scene(vbox);
primaryStage.setScene(scene);
primaryStage.show();
System.out.println(new File(fileUrl.getFile()).exists());
}
但是当我用另一个现有的 jpg 文件替换 fileUrl 时,在同一目录中,它会打开一个空白窗口,并打印 true。
编辑2:
我找到了我不知道的-Dprism.verbose=true -Djavafx.verbose=true
调试标志,它们打印了问题:
一些 JPEG 库,我不确定它是嵌入在 JavaFX SDK 中还是与操作系统相关,其版本与预期不同。现在,那是哪个图书馆,我不知道!
rpm -qa | grep -P jpe?g
返回:
libjpeg-turbo-2.0.5-5.fc33.i686
libjpeg-turbo-2.0.5-5.fc33.x86_64
libjpeg-turbo-devel-2.0.5-5.fc33.x86_64
mjpegtools-libs-2.1.0-20.fc33.x86_64
openjpeg2-2.3.1-10.fc33.x86_64
解决方案
推荐阅读
- xml - 从桌面文件夹中的多个 XML 文件中获取多个字段并将它们放入访问表中
- javascript - ES6 剩余参数实参示例
- react-native - FlatList 将 PanResponder 项目锁定在里面
- image-processing - Image Magick:如何将 png 文件转换为原始 NV21 和 NV12
- python - 拆分列表列表的最后一个空间的第一个元素
- java - CDI 从另一个 JAR 装饰服务
- python - 为什么正则表达式无法匹配所有所需的组
- mysql - 根据与同一表的关系过滤表中的元素
- heroku - node-pre-gyp:heroku push 中的权限被拒绝
- python - 从文本中删除标点符号,然后作为字典存储在数据列中