3

JFrame が閉じられたときに Clojure プログラムを終了させたいです。

私はクローズイベントをトラップして処理しようとしています:

(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

私は を使用EXIT_ON_CLOSEしますが、最初の試行が機能しなかった理由は、プロキシの本体に(System/exit 0)ではなくが含まれている必要があるため(fn [] (System/exit 0))です。終了するのではなく、呼び出されたときに終了する関数を返します (そして破棄します) 。

于 2011-06-23T03:25:41.460 に答える
3

Java では次のようになります。

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

より複雑な例は、フレームに関する公式の Java Swing チュートリアルにあります。

于 2011-06-22T07:07:45.847 に答える
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 に答える