Как предотвратить JFrame/EXIT_ON_CLOSE от уничтожения сервера nrepl?

EDIT Использование DISPOSE_ON_CLOSE — это не то, что мне нужно, потому что у меня есть «обратная» проблема: REPL остается активным, когда я закрываю JFrame (что хорошо), но затем также остается в живых при запуске из-за пределов REPL (что плохо).

Я пишу Swing-приложение на Clojure, и мне удобно тестировать как из REPL (nrepl под Emacs), так и извне REPL (например, используя lein run или запустив автономный < em>.jar).

Когда я не запускаю свое приложение Swing из REPL, мне удобно установить операцию закрытия по умолчанию EXIT_ON_CLOSE. Например:

 (.setDefaultCloseOperation jframe JFrame/EXIT_ON_CLOSE)

Так что я могу нажать кнопку закрытия JFrame и покончить с моим приложением.

Однако, по-видимому (я могу ошибаться в этом, но я думаю, что я ничего не вижу), это проблематично при запуске из REPL: как только я нажимаю кнопку закрытия JFrame, я, по-видимому, убиваю nrepl server и должны повторно открыть новый nrepl.

Зная, что мне нужно тестировать как из nrepl, так и извне любого REPL, как я могу решить свою проблему?

Должен ли я «обнаружить», что я запущен из REPL, а затем не устанавливать операцию закрытия по умолчанию для выхода? Или?


person Cedric Martin    schedule 10.04.2013    source источник


Ответы (2)


JFrame.EXIT_ON_CLOSE закрывает приложение, вызывая System.exit(), который завершает работающую в данный момент виртуальную машину Java. Поскольку и ваше приложение, и REPL работают внутри одной и той же JVM (поскольку вы запустили свое приложение из REPL), это означает, что REPL также будет уничтожен.

Вместо этого попробуйте использовать:

(.setDefaultCloseOperation jframe JFrame/DISPOSE_ON_CLOSE)

Это также скроет (и удалит) JFrame, когда вы нажмете кнопку закрытия, но сохраните свою JVM — и, следовательно, ваш REPL — работающим.

person Thomas    schedule 10.04.2013
comment
Я полностью это знаю... Проблема в том, что если я делаю это, когда запускаю свое приложение из-за пределов REPL (скажем, прямо из терминала), то приложение не закрывается, когда я нажимаю кнопку закрытия! - person Cedric Martin; 10.04.2013
comment
Да, знаю. Я немного поиграл, пытаясь обойти это, но не смог сделать это должным образом. Извините, я думаю, что на данный момент это лучшее, что вы можете сделать. :-/ - person Thomas; 11.04.2013

Используйте переменную среды при запуске REPL и выберите, следует ли удалять при закрытии или выходить при закрытии в зависимости от этой переменной.

При автономном запуске проверка переменных завершится ошибкой, и вы сможете выйти при закрытии.

Редактировать:

В оболочке:

export REPL_MODE=true ; lein repl

В коде кложура:

(def repl-mode (System/getenv "REPL_MODE"))
(if (not (nil? repl-mode))
     ; in repl, set to dispose on close
     ; in standalone mode, set to exit on close
person Nicolas Modrzyk    schedule 11.04.2013
comment
Я мог бы сделать это ... Не могли бы вы немного отредактировать свой вопрос, чтобы показать, как я могу прочитать эту переменную среды из Clojure? - person Cedric Martin; 12.04.2013