我希望我的Clojure程序在JFrame关闭时退出。
我正试图陷阱并处理关闭事件:
(def exit-action (proxy [WindowAdapter] []
(windowClosing [event] (fn [] (System/exit 0)))
)
)
(.addWindowListener frame exit-action)
这不会引发任何明显的错误,但它似乎也没有做我想要的。
对此表示感谢。
答案:
改编Rekin的答案就是诀窍:
(.setDefaultCloseOperation frame JFrame/EXIT_ON_CLOSE)
请注意:
setDefaultCloseOperation
不
setDefaultOperationOnClose
答案 0 :(得分:3)
在Java中:
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
更详细的例子可以在官方Java Swing tutorial about Frames
中找到答案 1 :(得分:3)
我会使用EXIT_ON_CLOSE
,但您首次尝试无效的原因是代理机构应包含(System/exit 0)
,而不是(fn [] (System/exit 0))
。你没有退出,而是返回(然后扔掉)一个函数,在被调用时会退出。
答案 2 :(得分:2)
这是我前一段时间在blog上展示的简短演示程序
(ns net.dneclark.JFrameAndTimerDemo
(:import (javax.swing JLabel JButton JPanel JFrame Timer))
(:gen-class))
(defn timer-action [label counter]
(proxy 1 []
(actionPerformed
[e]
(.setText label (str "Counter: " (swap! counter inc))))))
(defn timer-fn []
(let [counter (atom 0)
label (JLabel. "Counter: 0")
timer (Timer. 1000 (timer-action label counter))
panel (doto (JPanel.)
(.add label))]
(.start timer)
(doto (JFrame. "Timer App")
(.setContentPane panel)
(.setDefaultCloseOperation JFrame/EXIT_ON_CLOSE)
(.setLocation 300 300)
(.setSize 200 200)
(.setVisible true)))
(println "exit timer-fn"))
(defn -main []
(timer-fn))
请注意timer-fn []中设置默认关闭操作的行。就像Java一样,但有一点点语法摆弄。
博客条目的目的是展示Clojure中闭包的一个例子。