繁体   English   中英

如何防止JFrame / EXIT_ON_CLOSE杀死nrepl服务器?

[英]How to prevent JFrame/EXIT_ON_CLOSE from killing the nrepl server?

编辑使用DISPOSE_ON_CLOSE是不是我后,因为他们,我已经得到了“倒”的问题:REPL保持活着当我关闭的JFrame(这是好的),但是它从REPL外launced时保持活着(不好)。

我在Clojure中编写了一个Swing应用程序,发现从REPL(在Emacs下为nrepl )和从REPL外部进行测试都很方便(例如,通过使用lein run或通过运行独立的.jar )。

当我不从REPL启动我的Swing应用程序时,发现将默认关闭操作设置为EXIT_ON_CLOSE很方便。 例如:

 (.setDefaultCloseOperation jframe JFrame/EXIT_ON_CLOSE)

因此,我可以单击JFrame的关闭按钮,并完成我的应用程序。

但是显然(我可能会误解,但我认为我没有看到任何事情),这在从REPL运行时是有问题的:一旦我单击JFrame的关闭按钮,我显然会杀死nrepl服务器并必须重新打开一个新的nrepl

知道我需要同时从nrepl和任何REPL外部进行测试,如何解决我的问题?

我应该“检测”我正在从REPL运行,然后不将默认关闭操作设置为退出吗? 要么?

JFrame.EXIT_ON_CLOSE通过调用System.exit()退出应用程序,该应用程序终止当前正在运行的Java虚拟机 由于您的应用程序和REPL都在同一个JVM中运行(因为您是从REPL启动应用程序的),这意味着REPL也将被杀死。

而是尝试使用:

(.setDefaultCloseOperation jframe JFrame/DISPOSE_ON_CLOSE)

当您单击JFrame的关闭按钮时,这还将隐藏(并放置)JFrame,但保持JVM(从而使您的REPL)运行。

启动REPL时,请使用环境变量,然后根据该变量选择在关闭时进行处置还是在关闭时退出。

当独立启动时,变量检查将失败,因此您可以在关闭时退出。

编辑:

在外壳中:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM