JFrame的程序化关闭

14

什么是在JFrame右上角点击关闭(x)按钮的编程等效方法?

dispose()方法,但那不是同一件事,因为JFrame可以在关闭时设置执行几个不同的操作(更不用说是否涉及WindowListener了)


1
+1. 我一直想知道这个问题,但从未花时间去问。 - Andy
3个回答

16

你要求组件分派一个事件。在这种情况下,你希望它分派一个窗口关闭事件。

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

很棒,这正是我在寻找的。不过我认为你需要使用Swing.invokeLater(),以确保它在事件分派线程上运行。 - Jason S
@Jason,如果这是从Swing组件中调用的,则它已经在EDT上了。这就是为什么您永远不希望在Swing组件内部执行长时间计算的原因。(因为它们会阻塞EDT) - jjnguy
没错。但我想从另一个组件中调用它。(我使用了 public void closeWindow() 作为我的签名。) - Jason S

2
当你点击JFrame的X时,系统可以设置执行各种操作。 默认情况下,窗口仅使用setVisible(false)隐藏。
您可以设置框架在关闭时执行不同的操作 - 您可以使其处置、隐藏或调用代码,根据setDefaultCloseOperation的值。以下是选项:
DO_NOTHING_ON_CLOSE:不执行任何操作;要求程序在已注册的WindowListener对象的windowClosing方法中处理该操作。
HIDE_ON_CLOSE:在调用任何已注册的WindowListener对象后自动隐藏框架。
DISPOSE_ON_CLOSE:在调用任何已注册的WindowListener对象后自动隐藏和处置框架。
EXIT_ON_CLOSE:使用System exit方法退出应用程序。仅在应用程序中使用此选项。
但我认为你想要的是setVisible(false)。

0

你必须将调用插入到AWT消息队列中,以便所有的时间安排正确,否则它将无法分派正确的事件序列,特别是在多线程程序中。

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

这种方法“似乎”有效。获得了正确的用户体验。但是,这是否是AWT事件处理协议的适当方式?在一个事件处理程序中,如果我们需要分派另一个事件,我们是否应该使用稍后的Runnable排队?还是说,内部的dispatchEvent会妥善处理事件处理,直到当前事件结束之后再进行处理?(我不知道AWT的事件处理协议!) - Lonnie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接