3

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

3 回答 3

3

在 Java 中是:

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

更详细的示例可以在官方Java Swing 关于框架的教程中找到

于 2011-06-22T07:07:45.847 回答
3

我会使用EXIT_ON_CLOSE,但您第一次尝试失败的原因是代理的主体应该包含(System/exit 0),而不是(fn [] (System/exit 0)). 您不是退出,而是返回(然后丢弃)一个函数,该函数在被调用时会退出。

于 2011-06-23T03:25:41.460 回答
2

这是我不久前在我的博客上展示的一个简短的演示程序

(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 中的闭包示例。

于 2011-06-22T14:10:59.233 回答