【问题标题】:Programmatic close of JFrameJFrame 的程序化关闭
【发布时间】:2010-10-08 16:28:00
【问题描述】:

单击JFrame 右上角的关闭 (x) 按钮的编程等效项是什么?

dispose() 方法,但这不是一回事,因为 JFrame 可以设置为在关闭时执行多种不同的操作(更不用说是否涉及 WindowListener

【问题讨论】:

  • +1。我一直想知道这一点,但从来没有花时间问。

标签: java swing jframe


【解决方案1】:

您告诉组件调度一个事件。在这种情况下,您希望它调度一个 Window Closing 事件。

private void exit() {
    this.dispatchEvent(new WindowEvent(this, WindowEvent.WINDOW_CLOSING));
}

【讨论】:

  • 酷,这就是我想要的。我认为你需要使用 Swing.invokeLater() 来确保它在事件调度线程上。
  • @Jason,如果这是从 Swing 组件调用的,那么它已经在 EDT 上。这就是为什么您永远不想在 Swing 组件内进行长时间计算的原因。 (因为他们会阻止 EDT)
  • 对。但我想从另一个组件调用它。 (我用public void closeWindow() 作为我的签名。)
【解决方案2】:

当您点击 JFrame 上的 x 时,系统可以设置为执行各种操作。我相信默认是用 setVisible(false) 简单地隐藏窗口。

你可以设置一个框架在关闭时做不同的事情——你可以让它根据 setDefaultCloseOperation 处理、隐藏或调用代码。以下是选项:

DO_NOTHING_ON_CLOSE:什么都不做;要求程序在注册的WindowListener对象的windowClosing方法中处理操作。

HIDE_ON_CLOSE:在调用任何已注册的 WindowListener 对象后自动隐藏框架。

DISPOSE_ON_CLOSE:在调用任何已注册的 WindowListener 对象后自动隐藏和处置框架。

EXIT_ON_CLOSE:使用系统退出方法退出应用程序。仅在应用程序中使用它。

但我认为你所追求的是 setVisible(false)。

【讨论】:

    【解决方案3】:

    您必须将调用插入到 AWT 消息队列中,以便所有时间都正确发生,否则它将无法调度正确的事件序列,尤其是在多线程程序中。

    public void closeWindow()
    {
        if(awtWindow_ != null) {
            EventQueue.invokeLater(new Runnable() {
                public void run() {
                    awtWindow_.dispatchEvent(new WindowEvent(awtWindow_, WindowEvent.WINDOW_CLOSING));
                }
            });
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多