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

欢迎!请查看关于页面了解更多关于这里如何工作的信息。

0
Java 互操

我一直在尝试使用 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)上执行某些操作。有各种方法可以在另一个线程(例如,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(如果是公司的钱)。
by
非常感谢。我只是想获取java.awt.Robot的屏幕尺寸,所以cljfx就足够了。
by
如果你只需要屏幕尺寸,那么从理论上讲,awt/swing 会更加简单(并且肯定具有可移植性和向下兼容性)。

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

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