【发布时间】:2013-03-24 14:53:20
【问题描述】:
参考这个 SO question on a first UI program in Clojure,我创建了一个新的Leiningen 应用项目:
lein new app a-ui-app
将源代码复制到 leiningen 生成的 core.clj 并修改 -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) 在 clojure.lang.AFn.call(AFn.java:18) 在 clojure.lang.LockingTransaction.run(LockingTransaction.java:263) 在 clojure.lang.LockingTransaction.runInTransaction(LockingTransaction.java:231) 在 a_ui_app.core$fn__16$fn__21.invoke(core.clj:17) 在 a_ui_app.core.proxy$javax.swing.JPanel$KeyListener$6c415903.keyPressed(未知 源)在 java.awt.Component.processKeyEvent(Component.java:6340) 在 javax.swing.JComponent.processKeyEvent(JComponent.java:2809) 在 a_ui_app.core.proxy$javax.swing.JPanel$KeyListener$6c415903.processKeyEvent(未知 源)在 java.awt.Component.processEvent(Component.java:6159) 在 java.awt.Container.processEvent(Container.java:2083) 更多 线条...
我没有对project.clj 进行任何更改——只是使用了 leiningen 生成的那个。
我想了解发生了什么。我对 Java 线程一无所知。问题是否与 leiningen 启动应用程序的 Java 线程的方式有关?这是不可避免的吗?如果没有,我该如何修复它,无论是对于这个小示例程序还是未来,作为使用 UI 线程(我认为是 AWT-EventQueue-0)的未来项目的项目模式。
【问题讨论】:
-
附带说明,有谁知道第一行(alter-var-root 等)的效果是什么?它由 lein new app 生成_