【问题标题】:Clojure: exit program when Window Frame is ClosedClojure:关闭窗口框架时退出程序
【发布时间】:2011-06-22 07:05:16
【问题描述】:

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

【问题讨论】:

    标签: swing user-interface clojure close-application


    【解决方案1】:

    在 Java 中是:

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    

    更详细的例子可以在官方Java Swing tutorial about Frames找到

    【讨论】:

    • 我不知道为什么,但是 setDefaultCloseOperation 失败,出现关于无法找到 JFrame.EXIT_ON_CLOSE 的错误(没有关于找不到函数的问题) setDefaultCloseOperation 做了需要做的事情,没有关于找不到这样的错误EXIT_ON_CLOSE。我想它可能是不同的JVM版本。再次感谢。
    • 哦,对不起,那是因为我是凭记忆写的。我将编辑答案。
    【解决方案2】:

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

    【讨论】:

    • 感谢您的澄清。我最初认为我需要一个 ad-hock 函数来确保我传递代理所需的东西;我没想到退出调用本身就是一个有效的函数。
    【解决方案3】:

    这是我不久前在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 中的闭包示例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多