本教程是针对JDK 8编写的。本页面描述的示例和实践未利用后续版本引入的改进,并可能使用不再可用的技术。
有关Java SE 9及以后版本中更新的语言特性的概述,请参阅Java语言变更。
有关所有JDK版本的新功能、增强功能以及已删除或弃用选项的信息,请参阅JDK发布说明。
组件监听器是用于接收组件事件的监听器接口。组件是具有可以在屏幕上显示和与用户进行交互的图形表示的对象。一些组件的例子是典型图形用户界面中的按钮、复选框和滚动条。
对组件事件感兴趣的类要么实现这个接口及其包含的所有方法,要么扩展抽象的ComponentAdapter类并只覆盖感兴趣的方法。从该类创建的监听器对象然后使用组件的addComponentListener方法注册到组件中。当组件的大小、位置或可见性发生变化时,监听器对象中的相关方法被调用,并将ComponentEvent传递给它。
一个或多个组件事件会由Component
对象在组件被隐藏、显示、移动或调整大小之后触发。
组件隐藏和组件显示事件仅作为调用Component
的setVisible
方法的结果发生。例如,一个窗口可能被缩小成图标(iconified),而不会触发组件隐藏事件。
要编写一个简单的组件监听器程序,请按照以下步骤:
public class ComponentEventDemo ... implements ComponentListener
.... label.addComponentListener(this); ..... checkbox.addComponentListener(this); .... panel.addComponentListener(this); ... frame.addComponentListener(this);
public void componentHidden(ComponentEvent e) { displayMessage(e.getComponent().getClass().getName() + " --- Hidden"); } public void componentMoved(ComponentEvent e) { displayMessage(e.getComponent().getClass().getName() + " --- Moved"); } public void componentResized(ComponentEvent e) { displayMessage(e.getComponent().getClass().getName() + " --- Resized "); } public void componentShown(ComponentEvent e) { displayMessage(e.getComponent().getClass().getName() + " --- Shown"); }
以下示例演示了组件事件。窗口包含一个带有标签和复选框的面板。复选框控制标签是否可见。文本区域每次窗口、面板、标签或复选框触发组件事件时显示一条消息。
您可以在ComponentEventDemo.java中找到演示代码。以下是处理组件事件的代码:
public class ComponentEventDemo ... implements ComponentListener { static JFrame frame; JLabel label; ... public ComponentEventDemo() { ... JPanel panel = new JPanel(new BorderLayout()); label = new JLabel("这是一个标签", JLabel.CENTER); label.addComponentListener(this); panel.add(label, BorderLayout.CENTER); JCheckBox checkbox = new JCheckBox("标签可见", true); checkbox.addComponentListener(this); panel.add(checkbox, BorderLayout.PAGE_END); panel.addComponentListener(this); ... frame.addComponentListener(this); } ... public void componentHidden(ComponentEvent e) { displayMessage(e.getComponent().getClass().getName() + " --- 隐藏"); } public void componentMoved(ComponentEvent e) { displayMessage(e.getComponent().getClass().getName() + " --- 移动"); } public void componentResized(ComponentEvent e) { displayMessage(e.getComponent().getClass().getName() + " --- 调整大小"); } public void componentShown(ComponentEvent e) { displayMessage(e.getComponent().getClass().getName() + " --- 显示"); } public static void main(String[] args) { ... // 创建并设置窗口。 frame = new JFrame("ComponentEventDemo"); ... JComponent newContentPane = new ComponentEventDemo(); frame.setContentPane(newContentPane); ... } }
所有这些方法也在适配器类ComponentAdapter
中。
方法 | 目的 |
---|---|
componentHidden(ComponentEvent) | 在监听的组件通过调用setVisible 方法隐藏后调用。 |
componentMoved(ComponentEvent) | 在监听的组件相对于其容器移动后调用。例如,如果移动了一个窗口,则窗口会触发组件移动事件,但它包含的组件不会触发此事件。 |
componentResized(ComponentEvent) | 在监听的组件的大小(矩形边界)更改后调用。 |
componentShown(ComponentEvent) | 在监听的组件通过调用setVisible 方法变为可见后调用。 |
方法 | 目的 |
---|---|
Component getComponent() | 返回触发事件的组件。您可以使用此方法代替getSource 方法。 |
示例 | 所述位置 | 备注 |
---|---|---|
ComponentEventDemo |
本节 | 报告发生在几个组件上的所有组件事件,以演示触发组件事件的情况。 |