本教程是针对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 |
本节 | 报告发生在几个组件上的所有组件事件,以演示触发组件事件的情况。 |