编辑使用DISPOSE_ON_CLOSE不是我所追求的,因为我们遇到了“反向”问题:当我关闭JFrame(这很好)时,REPL保持活着状态当从REPL外部(这是坏的)开始时,也保持活着。
我正在Clojure中编写一个Swing应用程序,我发现从REPL(Emacs下的 nrepl )和REPL外部测试东西都很方便(例如使用{{1}或者通过运行独立的 .jar )。
当我没有从REPL启动我的Swing应用程序时,我发现将默认关闭操作设置为EXIT_ON_CLOSE很方便。例如:
lein run
所以我可以点击JFrame的关闭按钮,完成我的应用程序。
然而显然(我可能对此有误,但我认为我没有看到的东西)从REPL运行时这是有问题的:一旦我点击JFrame的关闭按钮,我显然会杀死 nrepl < / em>服务器,必须重新打开一个新的 nrepl 。
知道我需要从 nrepl 和外部任何REPL进行测试,我该如何解决我的问题?
我应该“检测”我是从REPL运行然后没有设置默认关闭操作退出吗?或?
答案 0 :(得分:0)
JFrame.EXIT_ON_CLOSE
通过调用System.exit()
terminates the currently running Java virtual machine来退出应用程序。由于您的应用程序和REPL都在同一个JVM中运行(因为您已经从REPL启动了应用程序),这意味着REPL也会被杀死。
相反,请尝试使用:
(.setDefaultCloseOperation jframe JFrame/DISPOSE_ON_CLOSE)
当您单击其关闭按钮时,这也将隐藏(和处置)JFrame,但保持您的JVM - 以及您的REPL - 正在运行。
答案 1 :(得分:0)
启动REPL时使用环境变量,并根据该变量选择是关闭还是退出onclose。
独立启动时,变量检查会失败,因此您可以在关闭时退出。
编辑:
在shell中:
export REPL_MODE=true ; lein repl
在clojure代码中:
(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