如何编写组件侦听器

组件侦听器是用于接收组件事件的侦听器interface。组件是具有图形表示的对象,该对象可以显示在屏幕上并可以与用户进行交互。组件的一些示例是典型图形用户interface的按钮,复选框和滚动条。

对处理组件事件感兴趣的类要么实现此interface及其包含的所有方法,要么扩展抽象的 ComponentAdapter 类,使其仅覆盖感兴趣的方法。然后使用该组件的 addComponentListener 方法向该组件注册从该类创建的侦听器对象。当组件的大小,位置或可见性更改时,将调用侦听器对象中的相关方法,并将 ComponentEvent 传递给它。

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

隐藏组件和显示组件的事件仅是由于调用ComponentsetVisible方法而发生的。例如,一个窗口可能被缩小为一个图标(图标化),而没有引发组件隐藏事件。

要编写一个简单的组件侦听器程序,请遵循以下步骤:

  • 声明一个实现 Component 侦听器的类。例如:
public class ComponentEventDemo ... implements ComponentListener
  • 确定您要catch事件的组件。例如:窗格,标签,复选框等。

  • 将组件侦听器添加到已标识的组件。例如:

....
label.addComponentListener(this);
.....
checkbox.addComponentListener(this);
....
panel.addComponentListener(this);
...
frame.addComponentListener(this);
  • 最后,通过使用组件侦听器的四种方法来catch这些组件的不同事件,如下所示:
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");

    }

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

展示组件事件的窗口

Try this:

  • 单击启动按钮以使用Java™Web 开始(下载 JDK 7 或更高版本)运行 ComponentEventDemo。另外,要自己编译和运行示例,请查阅example index

  • 出现窗口时,将触发一个或多个组件显示的事件。

  • 单击复选框以隐藏标签。
    标签会触发组件隐藏事件。面板触发组件移动和组件调整大小的事件。该复选框将触发一个组件移动的事件。

  • 再次单击复选框以显示标签。
    标签会触发组件显示的事件。面板触发组件移动和组件调整大小的事件。该复选框将触发一个组件移动的事件。

  • 图标化然后取消图标化窗口。
    不会获取组件隐藏或显示的事件。如果希望收到有关图标化事件的通知,则应使用窗口侦听器或窗口状态侦听器。

  • 调整窗口大小。
    您将看到所有四个组件(标签,复选框,面板和框架)的组件调整大小(可能还有组件移动)事件。如果框架和面板的布局 管理 器没有使每个组件都尽可能宽,则面板,标签和复选框的大小将不会调整。

您可以在ComponentEventDemo.java中找到该演示的代码。这只是与处理组件事件有关的代码:

public class ComponentEventDemo ... implements ComponentListener {
    static JFrame frame;
    JLabel label;
    ...
    public ComponentEventDemo() {
        ...
        JPanel panel = new JPanel(new BorderLayout());
        label = new JLabel("This is a label", JLabel.CENTER);
        label.addComponentListener(this);
        panel.add(label, BorderLayout.CENTER);

        JCheckBox checkbox = new JCheckBox("Label visible", 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() + " --- 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");

    }

    public static void main(String[] args) {
        ...
        //Create and set up the window.
        frame = new JFrame("ComponentEventDemo");
        ...
        JComponent newContentPane = new ComponentEventDemo();
        frame.setContentPane(newContentPane);
        ...
    }
}

组件侦听器 API

ComponentListener interface

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

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

ComponentEvent 类

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

使用组件侦听器的示例

下表列出了使用组件侦听器的示例。

ExampleWhere DescribedNotes
ComponentEventDemoThis section报告在几个组件上发生的所有组件事件,以演示触发组件事件的情况。