Clojure:窗口框架关闭时退出程序

时间:2011-06-22 07:05:17

标签: swing user-interface clojure close-application

我希望我的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

3 个答案:

答案 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中闭包的一个例子。