Clojure: выход из программы, когда оконная рама закрыта - PullRequest
3 голосов
/ 22 июня 2011

Я бы хотел, чтобы моя программа Clojure закрывалась при закрытии JFrame.

Я пытаюсь перехватить и обработать событие закрытия как таковое:

(def exit-action (proxy [WindowAdapter] []
               (windowClosing [event] (fn [] (System/exit 0)))
               )
)
(.addWindowListener frame exit-action)

Это не приводит к очевидным ошибкам, но, похоже, не делает то, что я хочу.

Помощь приветствуется.

Ответ:

Адаптация ответа Рекина сделала свое дело:

(.setDefaultCloseOperation frame JFrame/EXIT_ON_CLOSE)

Обратите внимание, что это:

setDefaultCloseOperation 

не

setDefaultOperationOnClose

Ответы [ 3 ]

3 голосов
/ 23 июня 2011

Я бы использовал EXIT_ON_CLOSE, но причина, по которой ваша первая попытка не сработала, состоит в том, что тело прокси должно содержать (System/exit 0), а не (fn [] (System/exit 0)). Вместо выхода вы возвращали (а затем отбрасывали) функцию, которая, при вызове , могла бы выйти.

3 голосов
/ 22 июня 2011

В Java это:

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

Более подробные примеры можно найти в официальном руководстве по Java Swing о фреймах

2 голосов
/ 22 июня 2011

Вот короткая демонстрационная программа, которую я показывал в своем блоге некоторое время назад

(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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...