在 Clojure 中使用 Swing - 编译器异常:无法初始化 RepaintManager

Using Swing in Clojure - Compiler Exception: could not initialise RepaintManager

我刚刚开始尝试使用 Swing 和 Clojure 创建 UI。 但是我在尝试加载它时遇到了 CompilerException。我一直在关注本教程'https://stuartsierra.com/2010/01/02/swing-into-actions-with-clojure'。

我正在使用带有 Cursive 的 IntelliJ IDEA 社区,使用 Leiningen 和 Clojure 1.8,我正在使用 Linux Mint 19.1(如果这很重要的话)。

我的代码:

(defn say-hello []
  (JOptionPane/showMessageDialog
    nil "Hello, World!" "Greeting" JOptionPane/INFORMATION_MESSAGE))

(def act (proxy [ActionListener] []
           (actionPerformed [event] (say-hello))))

(def button (doto (JButton. "Click Me!")
              (.addActionListener act)))

(def panel (doto (JPanel.)
             (.add button)))
(def frame (doto (JFrame. "Hello Frame")
             (.setSize 800 800)
             (.setContentPane panel)
             (.setVisible true)))


(def frame (doto (JFrame. "SportSeer")
             (.setSize 800 800)
             (.setVisible true)))

当 运行 通过 nREPL 我得到:

Loading src/sportseer_client/core.clj... 
CompilerException java.lang.NoClassDefFoundError: Could not initialize class javax.swing.RepaintManager, compiling:(core.clj:12:13) 

编辑: 另外,当我重新启动 REPL 并第一次加载文件时,出现此错误:

Loading src/sportseer_client/core.clj... 
CompilerException java.awt.AWTError: Assistive Technology not found: org.GNOME.Accessibility.AtkWrapper, compiling:(core.clj:12:13)

当我单独在 repl 中搞乱时,我已经让这个示例以某种方式工作,然后能够毫无问题地从文件加载。除了使用其他导入函数外,不知道我做了什么不同的事情:

(import '(javax.swing JOptionPan JButton JFrame JPanel))

但我无法再复制它并让它发挥作用。

如果能为我指出正确的方向来解决此问题,我们将不胜感激。

我认为这个问题是由于使用 OpenJDK 而不是 OracleJDK 造成的。 自从将项目 SDK 更改为 OracleJDK 后,我不再遇到这个问题,所以如果以后有人遇到这个问题......这可能是解决方法。

我在 linux 服务器上使用 OpenJDK 运行 PDF 生成代码(使用 AWT)时看到 CompilerException java.awt.AWTError: Assistive Technology not found 8. 之后切换到 JDK 10/11 错误消失了。

与图形相关的代码可能存在很多 "fun" 问题,尤其是当您 运行 在没有正确显示的服务器上时。

我知道在 运行 在 docker 中使用 Alpine Linux 分布时我们会得到 CompilerException java.lang.NoClassDefFoundError: Could not initialize class 错误 - 尽管它是不同的:java.lang.NoClassDefFoundError: Could not initialize class sun.awt.image.IntegerInterleavedRaster

在我们的案例中,它最终与 fontconfig 包相关。对于 Apline Linux 以下帮助:apk --update add ttf-dejavu

有关此问题的更多信息: