【问题标题】:How to prevent JFrame/EXIT_ON_CLOSE from killing the nrepl server?如何防止 JFrame/EXIT_ON_CLOSE 杀死 nrepl 服务器?
【发布时间】:2013-04-01 17:46:30
【问题描述】:

EDIT 使用 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 运行的,然后不将默认关闭操作设置为退出?还是?

【问题讨论】:

    标签: emacs clojure nrepl


    【解决方案1】:

    JFrame.EXIT_ON_CLOSE 通过调用System.exit() 其中terminates the currently running Java virtual machine 退出应用程序。由于您的应用程序和 REPL 在同一个 JVM 中运行(因为您已经从 REPL 启动了您的应用程序),这意味着 REPL 也会被杀死。

    请尝试使用:

    (.setDefaultCloseOperation jframe JFrame/DISPOSE_ON_CLOSE)
    

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

    【讨论】:

    • 我完全知道 ...在关闭按钮上!
    • 是的,我知道。我一直在尝试破解它,但无法正确完成它。抱歉,我认为目前这是你能做的最好的事情。 :-/
    【解决方案2】:

    在启动 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
    

    【讨论】:

    • 我可以这样做...您能否编辑一下您的问题以显示我如何从 Clojure 读取该环境变量?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-16
    • 2019-08-06
    相关资源
    最近更新 更多