该Java教程是针对JDK 8编写的。本页面描述的示例和实践不利用后续版本引入的改进,并可能使用不再可用的技术。
请参阅Java语言更改以获取Java SE 9及后续版本中更新的语言特性摘要。
请参阅JDK发布说明,了解所有JDK版本的新功能、增强功能以及已删除或已弃用选项的信息。
本节介绍了如何实现三种与窗口相关的事件处理程序:WindowListener
、WindowFocusListener
和WindowStateListener
。这三个监听器都处理WindowEvent
对象。所有三个事件处理程序中的方法都由抽象的WindowAdapter
类实现。
当适当的监听器已经在窗口上注册(比如一个frame或dialog),窗口事件会在窗口活动或状态发生后立即触发。如果窗口接收键盘输入,那么该窗口被认为是“焦点所有者”。
以下窗口活动或状态可能在窗口事件之前发生:
WindowListener
接口定义了处理大多数窗口事件的方法,例如打开和关闭窗口的事件,窗口的激活和非激活,以及窗口的图标化和取消图标化。
另外两个窗口监听器接口是WindowFocusListener
和WindowStateListener
。WindowFocusListener
包含检测窗口成为焦点所有者或失去焦点所有者状态的方法。WindowStateListener
只有一个方法,用于检测窗口状态的更改,例如窗口被图标化、取消图标化、最大化或恢复为正常状态。
虽然您可以使用WindowListener
方法来检测一些窗口状态,例如图标化,但使用WindowStateListener
可能更好,有两个原因:它只有一个需要您实现的方法,并且它提供了对最大化的支持。
java.awt.Toolkit
的方法isFrameStateSupported(int)
来确定特定窗口状态是否由特定窗口管理器支持。稍后在本节中描述的WindowEventDemo示例演示了如何使用此方法。
窗口监听器通常用于实现自定义的窗口关闭行为。例如,可以使用窗口监听器在关闭窗口之前保存数据,或者在最后一个窗口关闭时退出程序。
用户不一定需要实现窗口监听器来指定当用户关闭窗口时窗口应该做什么。默认情况下,当用户关闭窗口时,窗口变为不可见。要指定不同的行为,请使用JFrame
或JDialog
类的setDefaultCloseOperation
方法。要实现窗口关闭处理程序,使用setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE)
方法,以便窗口监听器提供所有窗口关闭任务。有关如何使用setDefaultCloseOperation
的详细信息,请参见响应窗口关闭事件。
System.exit(int)
AWT线程问题
窗口监听器还常用于在窗口被图标化时停止线程和释放资源,并在窗口取消图标化时重新启动。这样可以避免不必要地使用处理器或其他资源。例如,当包含动画的窗口被图标化时,应停止其动画线程并释放任何大缓冲区。当窗口取消图标化时,可以重新启动线程并重新创建缓冲区。
以下示例演示了窗口事件。一个不可编辑的文本区域报告了窗口触发的所有窗口事件。该演示实现了WindowListener
、WindowFocusListener
和WindowStateListener
接口中的所有方法。您可以在WindowEventDemo.java
中找到演示代码。
windowStateChanged
方法提供了与WindowListener类中的windowIconified
和windowDeiconified
方法相同的信息。还报告窗口激活和窗口获得焦点事件。这里是演示窗口事件处理的代码:
WindowEvent
WindowAdapter
方法 | 用途 |
---|---|
windowOpened(WindowEvent) | 在监听的窗口首次显示后调用。 |
windowClosing(WindowEvent) | 响应用户请求关闭监听的窗口时调用。要真正关闭窗口,监听器应该调用窗口的 dispose 或 setVisible(false) 方法。 |
windowClosed(WindowEvent) | 在监听的窗口关闭后调用。 |
windowIconified(WindowEvent) windowDeiconified(WindowEvent) |
在监听的窗口被最小化或取消最小化后调用。 |
windowActivated(WindowEvent) windowDeactivated(WindowEvent) |
在监听的窗口被激活或取消激活后调用。这些方法不会发送给非框架或对话框的窗口。因此,最好使用 windowGainedFocus 和 windowLostFocus 方法来确定窗口何时获得或失去焦点。 |
方法 | 目的 |
---|---|
windowGainedFocus(WindowEvent) windowLostFocus(WindowEvent) |
在被监听的窗口获得或失去焦点后调用。 |
方法 | 目的 |
---|---|
windowStateChanged(WindowEvent) | 在被监听的窗口被最小化、还原、最大化或返回正常状态后调用。状态通过WindowEvent 以位掩码的形式提供。在java.awt.Frame 中定义了可能的值,包括:
|
方法 | 目的 |
---|---|
Window getWindow() | 返回触发事件的窗口。您可以使用此方法代替 getSource 方法。 |
Window getOppositeWindow() | 返回与此焦点或激活更改相关的其他窗口。对于 WINDOW_ACTIVATED 或 WINDOW_GAINED_FOCUS 事件,返回失去激活或焦点的窗口。对于 WINDOW_DEACTIVATED 或 WINDOW_LOST_FOCUS 事件,返回获得激活或焦点的窗口。对于带有不同 VM 或上下文中的 Java 应用程序或没有其他窗口的任何其他类型的 WindowEvent ,返回 null 。 |
int getOldState() int getNewState() |
对于 WINDOW_STATE_CHANGED 事件,这些方法以位掩码的形式返回窗口的前一个或新状态。 |
示例 | 描述位置 | 注释 |
---|---|---|
WindowEventDemo |
本节 | 报告所有在一个窗口上发生的窗口事件,以演示触发窗口事件的情况。 |
SliderDemo |
如何使用滑块 | 监听窗口最小化和恢复事件,以便在窗口不可见时停止动画。 |
InternalFrameEventDemo |
如何编写内部框架监听器 | 报告所有在一个内部框架上发生的内部框架事件,以演示触发内部框架事件的情况。内部框架事件类似于窗口事件。 |
DialogDemo |
文本组件特性 | CustomDialog.java 使用 setDefaultCloseOperation 而不是窗口监听器来确定用户关闭窗口时要采取的操作。 |
Framework |
— | 一个演示程序,允许创建和销毁多个窗口。 |