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

欢迎!请参阅关于页面了解该工作的更多信息。

0
Java Interop

我一直在尝试使用javafx.stage.Screen来获取我的屏幕尺寸。按照Java文档来操作。
以下是我写的代码:

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

我遇到了以下错误:

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

我尝试使用完全限定的名称和使用点特殊形式,但我遇到了相同的错误。在文档中,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 上的表现(这里那里有一些 API 更改)与更现代的 openjfx 不同。如果您计划进行大量的 JavaFX 开发,那么升级可能值得考虑。

JavaFX 包含在 Oracle Java 1.8 中,但不含在 Adoptopenjdk 中(获取它的安装也并不愉快)。我建议使用 Java 11+ 与 OpenJFX。
我使用的是 [zulu + jfx distribution](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+,那么它是一个更好的选择;否则,如果您是免费使用的,则可以使用 zulu;如果是公司支付,则可以使用 oracle。
非常感谢。我只是想获取 java.awt.Robot 的屏幕尺寸,所以 cljfx 就足够了
如果您只需要屏幕尺寸,理论上 awt/swing 会更简单(并且肯定更具可移植性和兼容性)。

(import '[java.awt Toolkit Dimension])
(defn get-screen-size []
      (let [dimension (.. Toolkit getDefaultToolkit getScreenSize)]
       {:height  (.getHeight dimension)
        :width (.getWidth dimension)}))

    用户 > (get-screen-size)
    {:height 2160.0, :width 3840.0}
...