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

Swing Clojure:窗口框架关闭时退出程序,swing,user-interface,clojure,close-application,Swing,User Interface,Clojure,Close Application,我希望我的Clojure程序在JFrame关闭时退出 我正试图捕获并处理关闭事件,如下所示: (def exit-action (proxy [WindowAdapter] [] (windowClosing [event] (fn [] (System/exit 0))) ) ) (.addWindowListener frame exit-action) 这不会抛出任何明显的错误,但它似乎也没有达到我想要的效果 感谢您的帮助 答复

我希望我的Clojure程序在JFrame关闭时退出

我正试图捕获并处理关闭事件,如下所示:

(def exit-action (proxy [WindowAdapter] []
               (windowClosing [event] (fn [] (System/exit 0)))
               )
)
(.addWindowListener frame exit-action)
这不会抛出任何明显的错误,但它似乎也没有达到我想要的效果

感谢您的帮助

答复:

根据雷金的回答做了调整:

(.setDefaultCloseOperation frame JFrame/EXIT_ON_CLOSE)
请注意,这是:

setDefaultCloseOperation 
不是:

在Java中,它是:

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

更详细的例子可以在官方网站上找到,这是我不久前在网上展示的一个简短演示程序

(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))
注意定时器fn[]中设置默认关闭操作的行。与Java差不多,但有一点语法上的问题


博客条目的目的是展示Clojure中的一个闭包示例。

我会在关闭时使用
EXIT\u
,但您第一次尝试失败的原因是代理主体应该包含
(系统/出口0)
,而不是
(fn[](系统/出口0))
。您没有退出,而是返回(然后扔掉)一个调用时会退出的函数。

我不知道为什么,但setDefaultCloseOperation失败,错误是无法在关闭时找到JFrame.exit_(没有找到函数的任何信息)setDefaultCloseOperation执行了所需的操作,没有出现在关闭时找不到出口的错误。我想可能是不同的JVM版本。再次感谢。哦,对不起,那是因为我凭记忆写的。我将编辑掉答案。谢谢你的澄清。我最初认为我需要一个ad-hock函数来确保我正在传递代理所需的内容;我忘记了exit调用本身就是一个有效的函数。
(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))