Swing Clojure:窗口框架关闭时退出程序
我希望我的Clojure程序在JFrame关闭时退出 我正试图捕获并处理关闭事件,如下所示: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) 这不会抛出任何明显的错误,但它似乎也没有达到我想要的效果 感谢您的帮助 答复
(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))