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

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

0
Java 其次操作

我正在尝试使用 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。Java 8上的JavaFX与更现代的openjfx有所不同(API在此处和那里有些变化)。如果你计划进行大量的javafx开发,这或许值得升级。

by
JavaFX 包含在Oracle Java 1.8中,但不包含在Adoptopenjdk中(安装过程中也不是什么乐趣)。建议使用Java 11+和OpenJFX。
by
[Zulu + JFX 发布版](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)的工具,它可以帮助更容易地管理jvms。

如果你可以使用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)}))

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