让 JFrame
关闭的正确方法是什么,就像用户按下 X
关闭按钮,或按下Alt F4(在Windows上)一样?
我通过以下方式设置我的默认关闭操作:
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
它完全符合我想要的上述控件 . 这个问题与此无关 .
我真正想要做的是使GUI的行为与按 X
关闭按钮会导致它的行为相同 .
假设我要扩展 WindowAdaptor
,然后通过 addWindowListener()
添加我的适配器实例作为监听器 . 我希望通过 windowDeactivated()
, windowClosing()
和 windowClosed()
看到与 X
关闭按钮相同的调用序列 . 可以这么说,撕毁窗户就像告诉它撕裂自己一样 .
18 回答
不仅要关闭JFrame而且要触发WindowListener事件,请尝试以下方法:
如果您不希望应用程序在关闭JFrame时终止,请使用:setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE)
而不是:setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
从文档:
DO_NOTHING_ON_CLOSE (defined in WindowConstants)
:什么都不做;要求程序在已注册的WindowListener对象的windowClosing方法中处理该操作 .HIDE_ON_CLOSE (defined in WindowConstants)
:在调用任何已注册的WindowListener对象后自动隐藏框架 .DISPOSE_ON_CLOSE (defined in WindowConstants)
:在调用任何已注册的WindowListener对象后自动隐藏和处置框架 .EXIT_ON_CLOSE (defined in JFrame)
:使用系统退出方法退出应用程序 . 仅在应用程序中使用它 .可能仍然有用:如果要再次显示相同的帧,可以在JFrame上使用
setVisible(false)
. 否则,请调用dispose()
以删除所有本机屏幕资源 ._011_从Peter Lang复制
https://stackoverflow.com/a/1944474/3782247
不太狡猾 .
作为CW答案发布问题正文中的内容 .
想要分享结果,主要来自以下camickr的链接 . 基本上我需要在应用程序's event queue. Here'上抛出
WindowEvent.WINDOW_CLOSING
,这是解决方案的概要不仅关闭JFrame而且关闭整个应用程序,因此“退出关闭”
要实现相同的结果,您必须有效地退出应用程序,因为这只是调用
效果完全一样 .
如果用Alt-F4或X表示"Exit the Application Immediately Without Regard for What Other Windows or Threads are Running",则
System.exit(...)
将以非常突然,蛮力和可能有问题的方式完成您想要的操作 .如果按Alt-F4或X表示隐藏窗口,那么
frame.setVisible(false)
就是你如何"close"窗口 . 窗口将继续消耗资源/内存,但可以非常快速地再次显示 .如果用Alt-F4或X表示隐藏窗口并处理它正在消耗的任何资源,那么
frame.dispose()
就是你如何"close"窗口 . 如果框架是最后一个可见窗口并且没有其他非守护程序线程在运行,程序将退出 . 如果再次显示该窗口,则必须再次重新初始化所有本机资源(图形缓冲区,窗口句柄等) .dispose()
可能最接近您真正想要的行为 . 如果您的应用程序打开了多个窗口,您是否希望Alt-F4或X退出应用程序或关闭活动窗口?Java Swing Tutorial on Window Listeners可能有助于为您澄清事情 .
这是您的选择:
以编程方式关闭Swing框架的最佳方法是使其行为与按下“X”按钮时的行为相同 . 要做到这一点,您需要实现适合您需要的WindowAdapter,并设置框架的默认关闭操作以不执行任何操作(DO_NOTHING_ON_CLOSE) .
像这样初始化你的框架:
您可以通过发送WINDOW_CLOSING事件以编程方式关闭框架,如下所示:
这将关闭框架,就像按下“X”按钮一样 .
此示例显示如何实现确认的窗口关闭操作 .
该窗口有一个Window适配器,它根据您在
OptionDialog
中的答案将默认关闭操作切换为EXIT_ON_CLOSE
或DO_NOTHING_ON_CLOSE
.ConfirmedCloseWindow
的closeWindow
方法触发关闭窗口事件,可以在任何地方使用,即作为菜单项的动作如果您这样做是为了确保用户无法关闭窗口:
然后你应该改变你的
pullThePlug()
方法我发现这是与
WindowListener
和JFrame.DO_NOTHING_ON_CLOSE
一起玩的唯一方式 .退出Java运行过程非常简单,基本上你只需要做两件简单的事情:
System.exit(...)
. 例如,如果您的应用程序是基于帧的,则可以添加侦听器WindowAdapter
并在其方法windowClosing(WindowEvent e)
中调用System.exit(...)
.注意:您必须调用
System.exit(...)
否则您的程序会出错 .System.exit(...)
,但这并不意味着可以始终调用该方法,因为意外的java异常可能会阻止调用该方法 .这与您的编程技巧密切相关 .
**以下是一个最简单的示例(基于
JFrame
),它向您展示如何调用exit方法如果你真的不希望你的应用程序在关闭JFrame时终止,那么,
使用:
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
而不是:
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
这是解决方案的概要,
基于此处已提供的答案,这是我实现它的方式:
JFrame使事件关闭,并在关闭时退出 .
我试过这个,为 formWindowClosing() 事件编写自己的代码 .
这会询问用户是否要退出框架或应用程序 .
这个答案是亚历克斯给出的,我想推荐它 . 它对我有用,而另一件事则很简单,也很简单 .
如果您希望GUI的行为就像您单击
X
关闭按钮一样,则需要将窗口关闭事件分派给Window
. 来自Closing An Application的ExitAction
允许您将此功能添加到菜单项或任何轻松使用Action
的组件 .您必须将调用插入到AWT消息队列中,以便所有时间都正确发生,否则它将不会调度正确的事件序列,尤其是在多线程程序中 . 完成此操作后,您可以完全按照用户单击操作系统提供的装饰JFrame的[x]按钮的方式处理生成的事件序列 .