Использование Swing в Clojure - исключение компилятора: не удалось инициализировать RepaintManager
Я только начал пытаться создать пользовательский интерфейс с Clojure, используя Swing. Но я получаю CompilerException при попытке загрузить его. Я следовал этому руководству " https://stuartsierra.com/2010/01/02/swing-into-actions-with-clojure".
Я использую IntelliJ IDEA Community с Cursive, использую 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)
Каким-то образом этот пример работал, когда я возился с одним только реплеем, а затем смог загрузить его из файла без проблем. Понятия не имею, что я сделал по-другому, за исключением использования другой функции импорта:
(import '(javax.swing JOptionPan JButton JFrame JPanel))
но я больше не могу копировать это и заставить это работать.
Буду очень признателен за любую помощь, указав мне правильное направление, чтобы исправить это.
3 ответа
Я думаю, что эта проблема возникла из-за использования OpenJDK, а не OracleJDK. У меня больше нет этой проблемы с тех пор, как я изменил SDK проекта на OracleJDK, поэтому, если у кого-то еще будет эта проблема в будущем... это может быть исправлено.
Я видел CompilerException java.awt.AWTError: Assistive Technology not found
при попытке запустить код генерации PDF (который использует AWT) на сервере Linux с OpenJDK 8. После перехода на JDK 10/11 ошибка исчезла.
Может быть много "забавных" проблем с графическим кодом, особенно когда вы работаете на сервере без надлежащего отображения.
Я знаю, что мы получаем CompilerException java.lang.NoClassDefFoundError: Could not initialize class
ошибка в этом случае при запуске дистрибутива Alpine Linux в докере - хотя это был другой файл: java.lang.NoClassDefFoundError: Could not initialize class sun.awt.image.IntegerInterleavedRaster
В нашем случае это в конечном итоге было связано с fontconfig
пакет. Для Apline Linux помогло следующее: apk --update add ttf-dejavu
Подробнее об этой проблеме:
- Обязательно посмотрите также раздел "Качели и качели" в кулинарной книге Clojure.
- Более новая библиотека fn / fx для использования JavaFX от Clojure.