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

欢迎!请参阅 关于页面 获取有关如何工作的更多信息。

0
Java Interop

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

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

我得到以下错误

执行错误(NoClassDefFoundError)在用户/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)上执行某些操作。存在各种方法实例化javafx平台(例如repl)。

如果您对在clojure中编写更加高级的JavaFX编程感兴趣,我建议您查看cljfx。与使用Java 8的JavaFX相比,JavaFX在OpenJFX上有所不同(这里和那里的API有所变化)。如果您打算进行大量的JavaFX开发,可能值得升级。

JavaFX包含在Oracle Java 1.8中,但不包含在Adoptopenjdk(安装它也不是很有趣)。我建议使用Java 11+配合OpenJFX。
[Azul + 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(这种方法更简单,并且肯定更容易移植和向后兼容)。

    (导入 '[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}
...