【问题标题】:How to Run application in background when close the JFrame?关闭 JFrame 时如何在后台运行应用程序?
【发布时间】:2013-03-15 20:21:19
【问题描述】:

我在我的 java 应用程序中使用了 系统托盘。我想消失 GUI 并在 背景 中运行应用程序,但是当用户单击 JFrame 的 关闭 按钮时,系统托盘必须保持可用。

【问题讨论】:

  • 不要将框架设置为 EXIT_ON_CLOSE 或在框架关闭时调用 System.exit。事件派发线程将继续运行,直到 JVM 终止
  • @MadProgrammer 这是正确的答案——事实上,为什么不把它作为答案发布呢?
  • @adrian 一大早,如果喝茶,我需要再来一杯:P
  • 请看这个相关的例子,如何hide JFrame in SystemTray of TaskBar

标签: java swing jframe system-tray


【解决方案1】:

我想消失 GUI 并在后台运行应用程序,但是 当用户单击关闭按钮时,系统托盘必须保持可用 框架。

设置当用户在此框架上启动“关闭”时默认发生的操作。您必须指定以下选项之一:

DO_NOTHING_ON_CLOSE(在 WindowConstants 中定义):什么都不做;要求程序处理 已注册的 WindowListener 对象的 windowClosing 方法。

HIDE_ON_CLOSE(在 WindowConstants 中定义):在调用任何已注册的 WindowListener 对象后自动隐藏框架。

DISPOSE_ON_CLOSE(在 WindowConstants 中定义):在调用任何注册的 WindowListener 后自动隐藏和释放框架 对象。

EXIT_ON_CLOSE(在 JFrame 中定义):使用系统退出方法退出应用程序。仅在应用程序中使用它。

该值默认设置为 HIDE_ON_CLOSE。值的变化 此属性导致触发属性更改事件,其中 属性名称“defaultCloseOperation”。

【讨论】:

    【解决方案2】:

    将此作为答案发布

    就像 MadProgrammer 说的:

    不要将框架设置为 EXIT_ON_CLOSE 或在框架关闭时调用 System.exit。事件派发线程将继续运行,直到 JVM 终止

    【讨论】:

      【解决方案3】:

      您可以在单独的线程中使用系统托盘。

      【讨论】:

      • 这是一个非常危险的建议
      • 即使 TrayIcon 是一个 AWT 组件,它仍然依赖并使用 Event Dispatching Thread。这可能会导致 UI 更新在 EDT 的上下文之外执行。最好将非 UI 处理放在单独的线程中
      • 他说的...我刚刚花了一周的时间解决了从 EDT 外部调用 Swing 方法引起的缺陷。如果您不事先注意,这些事情需要永远追踪。
      • 好的。感谢您的解释。
      猜你喜欢
      • 2017-02-10
      • 1970-01-01
      • 2020-08-31
      • 2016-05-28
      • 2022-01-23
      • 2011-04-02
      • 2021-05-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多