文档

Java™教程
隐藏目录
如何编写Component监听器
路径:使用Swing创建GUI
课程:编写事件监听器
章节:为常见事件实现监听器

如何编写组件监听器

组件监听器是用于接收组件事件的监听器接口。组件是具有可以在屏幕上显示和与用户进行交互的图形表示的对象。一些组件的例子是典型图形用户界面中的按钮、复选框和滚动条。

对组件事件感兴趣的类要么实现这个接口及其包含的所有方法,要么扩展抽象的ComponentAdapter类并只覆盖感兴趣的方法。从该类创建的监听器对象然后使用组件的addComponentListener方法注册到组件中。当组件的大小、位置或可见性发生变化时,监听器对象中的相关方法被调用,并将ComponentEvent传递给它。

一个或多个组件事件会由Component对象在组件被隐藏、显示、移动或调整大小之后触发。

组件隐藏和组件显示事件仅作为调用ComponentsetVisible方法的结果发生。例如,一个窗口可能被缩小成图标(iconified),而不会触发组件隐藏事件。

要编写一个简单的组件监听器程序,请按照以下步骤:

以下示例演示了组件事件。窗口包含一个带有标签和复选框的面板。复选框控制标签是否可见。文本区域每次窗口、面板、标签或复选框触发组件事件时显示一条消息。

演示组件事件的窗口

请尝试以下操作: 
  1. 点击“启动”按钮以使用Java™ Web Start运行ComponentEventDemo(下载JDK 7或更高版本)。或者,如果要自行编译和运行示例,请参阅示例索引
    启动ComponentEventDemo示例
  2. 窗口出现时,已经触发了一个或多个组件显示事件。
  3. 点击复选框以隐藏标签。
    标签将触发组件隐藏事件。面板将触发组件移动和组件调整大小事件。复选框将触发组件移动事件。
  4. 再次点击复选框以显示标签。
    标签将触发组件显示事件。面板将触发组件移动和组件调整大小事件。复选框将触发组件移动事件。
  5. 将窗口最小化然后还原。
    您将不会收到组件隐藏或显示事件。如果要接收最小化事件的通知,您应该使用窗口侦听器或窗口状态侦听器。
  6. 调整窗口大小。
    您将从所有四个组件(标签、复选框、面板和窗口)收到组件调整大小(可能还有组件移动)事件。如果框架和面板的布局管理器没有将每个组件都尽可能宽,面板、标签和复选框将不会被调整大小。

您可以在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);
        ...
    }
}

组件监听器 API

组件监听器接口

所有这些方法也在适配器类ComponentAdapter中。

方法 目的
componentHidden(ComponentEvent) 在监听的组件通过调用setVisible方法隐藏后调用。
componentMoved(ComponentEvent) 在监听的组件相对于其容器移动后调用。例如,如果移动了一个窗口,则窗口会触发组件移动事件,但它包含的组件不会触发此事件。
componentResized(ComponentEvent) 在监听的组件的大小(矩形边界)更改后调用。
componentShown(ComponentEvent) 在监听的组件通过调用setVisible方法变为可见后调用。

组件事件类

方法 目的
Component getComponent() 返回触发事件的组件。您可以使用此方法代替getSource方法。

使用组件监听器的示例

示例 所述位置 备注
ComponentEventDemo 本节 报告发生在几个组件上的所有组件事件,以演示触发组件事件的情况。

上一页: 如何编写一个变更监听器
下一页: 如何编写一个容器监听器