1

编辑使用 DISPOSE_ON_CLOSE 不是我所追求的,因为它们我遇到了“逆”问题:当我关闭 JFrame 时,REPL 保持活动状态(这很好),但是当从 REPL 外部启动时它保持活动状态(这很糟糕)。

我正在 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 运行,然后不将默认关闭操作设置为退出?或者?

4

2 回答 2

0

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

相反,请尝试使用:

(.setDefaultCloseOperation jframe JFrame/DISPOSE_ON_CLOSE)

当您单击其关闭按钮时,这还将隐藏(并处置)JFrame,但保持您的 JVM - 以及您的 REPL - 运行。

于 2013-04-10T04:38:17.203 回答
0

启动 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
于 2013-04-11T11:47:05.533 回答