小编Eva*_*van的帖子

OpenJFX支持32位系统

我想为Windows x86 arch构建我的JavaFX应用程序.所以我下载了Adopt OpenJdk 32位版本并用它来创建Java Runtime Image.当我尝试运行应用程序时,我收到以下错误:

Loading library api-ms-win-core-console-l1-1-0 from resource failed: java.lang.UnsatisfiedLinkError: C:\Users\admin01\.openjfx\cache\11.0.1\api-ms-win-core-console-l1-1-0.dll: Can't load AMD 64-bit .dll on a IA 32-bit platform
java.lang.UnsatisfiedLinkError: C:\Users\admin01\.openjfx\cache\11.0.1\api-ms-win-core-console-l1-1-0.dll: Can't load AMD 64-bit .dll on a IA 32-bit platform
        at java.base/java.lang.ClassLoader$NativeLibrary.load0(Native Method)
Run Code Online (Sandbox Code Playgroud)

发生此错误是因为openjfx:javafx-graphics工件是平台相关的,它包括为64位arch编译的DLL.

$ file api-ms-win-core-console-l1-1-0.dll
api-ms-win-core-console-l1-1-0.dll: PE32+ executable (DLL) (console) x86-64, for MS Windows
Run Code Online (Sandbox Code Playgroud)

Maven Central中没有32位OpenJFX版本.

有可能在某处获得x86版本吗?或者我如何自己构建它?

java openjfx

11
推荐指数
1
解决办法
891
查看次数

Java NIO 无法从 JRT 映像读取文件

当我们通过JLINK创建Java运行时需要的所有Java类/资源,并把它们变成JRT映像文件:lib/modules

这是我使用的基本 Maven 项目资源结构:

src
  main
    resources
      dict
        xkcd_en
Run Code Online (Sandbox Code Playgroud)

我只是想阅读xkcd_en文本文件。如果我们查看 JRT 文件,它是:

>> jimage list /path/to/lib/modules
...
Module: main
    dict/xkcd_en
...
Run Code Online (Sandbox Code Playgroud)

此外,我已明确在 中打开它module-info,以防万一:

module main {
    opens dict;
    // ..rest code omitted
}
Run Code Online (Sandbox Code Playgroud)

我可以读取文件的唯一方法是将其作为输入流获取:

作品:

public static InputStream getResourceAsStream(String resource) {
    return FileUtils.class.getResourceAsStream(resource);
}

System.out.println(new BufferedReader(
    new InputStreamReader(getResourceAsStream("/dict/xkcd_en")))
            .lines().collect(Collectors.joining("\n"))
);
Run Code Online (Sandbox Code Playgroud)

不工作:

但是,如果我试图获取文件 URI 并通过 Java NIO API 读取它,则它不起作用:

public static URL getResourceOrThrow(String resource) {
    URL url = FileUtils.class.getResource(resource);
    Objects.requireNonNull(url);
    return url;
}
Run Code Online (Sandbox Code Playgroud)

1 - …

java nio java-module java-11

8
推荐指数
1
解决办法
1492
查看次数

如何在 JavaFX 9+ 应用程序中设置全局 CSS?

关于 SO 有几个问题,但是由于 JPMS 支持没有任何答案是有效的。

方法 1:JavaFX - 为整个应用程序设置默认 CSS 样式表

Application.setUserAgentStylesheet(Application.STYLESHEET_MODENA);
StyleManager.getInstance().addUserAgentStylesheet(getClass().getResource("/style.css").toString());
Run Code Online (Sandbox Code Playgroud)

不起作用,因为StyleManager成为私有 API 的一部分,JavaFX 不导出它。

方法二:/sf/answers/3570210591/

@import "com/sun/javafx/scene/control/skin/modena/modena.css";
/* rest of CSS code */
Run Code Online (Sandbox Code Playgroud)

不起作用,因为modena.css成为私有 API 的一部分,JavaFX 不导出它。

方法 3:将 CSS 设置为顶部父节点(/sf/answers/2021629501/

不起作用,因为 CSS 不会应用于模态窗口。

java javafx java-9

7
推荐指数
1
解决办法
492
查看次数

Vertx:executeBlocking() 与 Future。有什么不同?

Vertx 文档建议executeBlocking()在需要调用阻塞 API 时使用方法。另一方面,Vertx 还提供了一个 Future 的概念,它基本上做同样的事情。但该executeBlocking()方法不是静态的。它也不是 Future 的简单包装器,如果您查看它的实现,您会发现它非常复杂。这两者有什么区别?

假设我想以异步方式执行一些长时间运行的任务。这两种方法有什么区别吗?

方法一:

doTheJob() {
    Future<Void> future = Future.future();
    executeLongRunningBlockingOperation();
    future.complete();
    return future;
}

doTheJob().setHandler(asyncResult -> {
    // ... handle result
});
Run Code Online (Sandbox Code Playgroud)

方法二:

vertx.executeBlocking(future -> {
    executeLongRunningBlockingOperation();
    future.complete();
}, res -> {
    // ... handle result
});
Run Code Online (Sandbox Code Playgroud)

java asynchronous vert.x

3
推荐指数
1
解决办法
6395
查看次数

标签 统计

java ×4

asynchronous ×1

java-11 ×1

java-9 ×1

java-module ×1

javafx ×1

nio ×1

openjfx ×1

vert.x ×1