2024 Clojure状态调查!中分享您的想法。

欢迎!请参阅关于页面以了解如何使用本服务的更多信息。

0
Java互操作

我一直在尝试使用javafx.stage.Screen获取我的屏幕尺寸。按照java文档
下面是我的代码

(import javafx.stage.Screen)
(Screen/getPrimary)

我得到以下错误

执行错误(NoClassDefFoundError)在用户/eval194 (REPL:1)。
无法初始化类javafx.stage.Screen

我尝试使用全限定名和点特殊形式,但得到相同的错误。文档中class screen没有构造函数,所以我认为我不需要创建新实例。
Java版本:1.8.0_261
REPL:clj 1.10.0.442
命令行:powershell 5.1.17763.1432

为什么会发生这种情况?

1个回答

0

选中
 
最佳答案

JavaFX 可能不会包含在您的安装中。在某些情况下,您需要显式地包含它,或者安装 openjfx。如果您达到 Java 8,那么您必须使用 openjfx。此外,该平台需要特定的初始化,并期望在特定的事件调度线程(相对于 javafx)上执行某些操作。有各种方法从其他线程(例如 repl)中创建 javafx 平台实例。

如果您对 clojure 中更高级的 javafx 编程感兴趣,我会建议您查看cljfx。Javafx 在 Java 8 上与更现代的 openjfx有所不同(这里那里有些 API 变化)。如果您计划进行大量的 javafx 开发,这可能值得升级。

JavaFX包含在Oracle Java 1.8中,但不包含在Adoptopenjdk中(而且安装这东西也不是很愉快)。我建议使用Java 11+与OpenJFX。
我使用了[zulu + jfx distrivution](https://www.azul.com/downloads/zulu-community/?version=java-8-lts&architecture=x86-64-bit&package=jdk-fx),它有相当新的 javafx 实现(例如,webview 能够相当好地工作,甚至可以渲染 vega 图表)。安装只需解压缩归档文件和设置一些环境变量。在Linux上,有一个叫做[sdkman](https://sdkman.java.net.cn/usage)的工具,它可以更容易地在jvm之间切换。

如果可以使用JDK 11+,那么JDK 11+是更好的选择;否则,如果您生活自由,则使用Zulu(如果公司支付);否则,使用Oracle(如果公司支付)。
非常感谢。我只是想获取java.awt.Robot的屏幕尺寸,因此cljfx就足够了。
如果您只需要屏幕尺寸,那么从理论上说,AWT/Swing 将更加简单(并且肯定是可以移植和向后兼容的)。

    (导入'[java.awt Toolkit Dimension])
    (定义 get-screen-size [])
      (let [dimension (.. Toolkit getDefaultToolkit getScreenSize)]
        {:高度 (.getHeight dimension)}
        :宽度 (.getWidth dimension)}))

    user> (get-screen-size)
    {:高度 2160.0, :宽度 3840.0}
...