Clojureの最初のUIプログラムに関するこのSOの質問を参照して、新しいLeiningen
アプリプロジェクトを作成しました。
lein new app a-ui-app
ソースをcore.clj
そのleiningenが生成したものにコピーし、-main
それを呼び出すようにルーチンを変更しました
(defn -main
"See https://stackoverflow.com/questions/2792451/improving-my-first-clojure-program?rq=1."
[& args]
;; work around dangerous default behaviour in Clojure
(alter-var-root #'*read-eval* (constantly false))
(doto panel
(.setFocusable true)
(.addKeyListener panel))
(doto frame
(.add panel)
(.pack)
(.setDefaultCloseOperation JFrame/EXIT_ON_CLOSE)
(.setVisible true))
(loop []
(draw-rectangle panel @x @y)
(Thread/sleep 10)
(recur))
)
次に、どちらかを介して実行します
lein run
また
lein uberjar
java -jar ./target/a-ui-app-0.1.0-SNAPSHOT-standalone.jar
どちらの場合も、アプリは正常に動作しますが、アプリを起動するために使用したターミナルでは、数秒のランダムな遅延の後に例外が発生します。
スレッド「AWT-EventQueue-0」の例外java.lang.IllegalArgumentException:一致する句がありません:157 at a_ui_app.core $ fn__16 $ fn__21 $ fn__22.invoke(core.clj:19)at clojure.lang.AFn.call(AFn .java:18)at clojure.lang.LockingTransaction.run(LockingTransaction.java:263)at clojure.lang.LockingTransaction.runInTransaction(LockingTransaction.java:231)at a_ui_app.core $ fn__16 $ fn__21.invoke(core.clj: 17)a_ui_app.core.proxy $ javax.swing.JPanel $ KeyListener $ 6c415903.keyPressed(Unknown Source)at java.awt.Component.processKeyEvent(Component.java:6340)at javax.swing.JComponent.processKeyEvent(JComponent。 java:2809)at a_ui_app.core.proxy $ javax.swing.JPanel $ KeyListener $ 6c415903.processKeyEvent(Unknown Source)at java.awt.Component.processEvent(Component.java:6159)at java.awt.Container.processEvent( Container.java:2083)さらに多くの行...
私は変更を加えませんでしたproject.clj
-ライニンゲンで生成されたものを使用しただけです。
何が起こっているのか理解したいのですが。私はJavaスレッドに精通しているわけではありません。問題は、leiningenがアプリのJavaスレッドを起動する方法に関連していますか?やむを得ないですか?そうでない場合は、この小さなサンプルプログラムと今後の両方で、UIスレッドを使用する将来のプロジェクトのプロジェクトパターンとして、どのように修正できますか(私はそう思いますAWT-EventQueue-0
)。