第 3 方 Jar 退出我的程序?

Posted

技术标签:

【中文标题】第 3 方 Jar 退出我的程序?【英文标题】:3rd Party Jar Exiting my Program? 【发布时间】:2015-04-16 03:47:51 【问题描述】:

好的,所以最近我使用swing在java中制作了一个类似截图工具的程序,它允许您选择屏幕的一个区域并将其作为图像保存到您的计算机。

现在,我想做的是使用我制作的其他程序制作一个全新的项目。

但是,当我的新应用程序中启动 3rd 方 jar 时,它可以正常工作,但是当我关闭 3rd 方应用程序时,它也会关闭我的新应用程序。我确实在第 3 部分应用程序中使用了系统退出,我知道这是它关闭所有内容的原因。

现在我的问题是:出于这个原因使用系统退出是错误的吗?我可以做些什么来防止在不修改旧应用的情况下关闭我的新应用?

或者,您能否在将来提供建议而不是使用 system.exit,因为我仍然希望原来的能够正确关闭,我只是不希望使用旧 jar 的新 jar 也关闭.

我尝试在我的新应用中禁用系统退出,这只会产生更多问题。

【问题讨论】:

我想你可能想稍微探索一下 ServiceLoader 类。这样你就可以创建一个“SnippingProvider”...... 出于这个原因以及其他原因使用系统退出是错误的。它不应该用在任何可以用作库的代码中。不,你不能真正阻止它——你必须删除系统退出调用。 【参考方案1】:

不要使用 System.exit();

我可以做些什么来防止在不修改旧应用的情况下关闭我的新应用?

使用:

frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

如果框架是唯一打开的窗口,它将退出 JVM。如果其他窗口打开,则仅关闭当前窗口。当您点击窗口的“关闭”按钮时,使用默认的关闭操作。

更好的是,不要将 JFrame 用作工具的窗口。相反,您应该使用 JDialog。

【讨论】:

当然,如果原版的main还在运行,它也不会关闭,这是最重要的 如果我将旧应用程序修改为仅使用 DISPOSE_ON_CLOSE,它不会正确完全退出程序,只是摆脱窗口?编辑:没关系,我明白你在说什么,当我实例化第 3 方应用程序时,将 JFrame 修改为 DISPOSE_ON_CLOSE,然后原来的仍然是 EXIT_ON_CLOSE / System.exit()。我的解释正确吗? 是的,没错。但是,您也可以在主 JFrame 上使用 DISPOSE_ON_CLOSE,JVM 将处理该帧,然后在所有线程停止运行时退出 JVM。此外,如果您正在创建第 3 方应用程序,它不应该是 JFrame。它应该是一个 JDialog,然后它将被创建为 JFrame 的子窗口,因为它不是一个独立的应用程序。 好的,所以我只是在 3rd 方应用程序中进行了一些更改,并将 EXIT_ON_CLOSE 替换为 DISPOSE_ON_CLOSE 并将 System.exit(0) 替换为 dispose(),现在它可以正常工作了!谢谢大家的帮助!

以上是关于第 3 方 Jar 退出我的程序?的主要内容,如果未能解决你的问题,请参考以下文章

WiX - 安装先决条件和第 3 方应用程序

第 3 方应用程序“A”如何让 iOS 设备新手用户打开由第 3 方应用程序“B”下载的 MP3 文件?

Android-android 怎么实现只混淆自己的代码,而不混淆第3方jar包

Laravel - 第 3 方 API 的模型?

继续调用第 3 方,直到它返回 Hystrix 的预期响应

我可以将 Web API 和播放按钮小部件用于第 3 方 Spotify 移动应用程序吗?