java - 组件事件是如何被组件监听器捕获的

标签 java swing listener

这是捕获指定组件事件的方法:

public void componentHidden(ComponentEvent e) {
    displayMessage(e.getComponent().getClass().getName() + " --- Hidden");
}
public void componentMoved(ComponentEvent e) {
    displayMessage(e.getComponent().getClass().getName() + " --- Moved");
}

当我更改框架的大小或移动它时,会调用相应的方法。我没有看到任何具体的代码,比如如果框架移动,监听器调用组件隐藏;或者如果调整了框架大小,则调用 componentMoved。那么,监听器捕获到组件事件后如何进行分类,从而调用相应的方法呢?

最佳答案

在不深入任何源代码的情况下,基本的事件处理模型在很大程度上是这样的:

您有一个组件。该组件具有某种状态。

private boolean pressed;

当状态发生变化时,将触发一个事件。

public void setPressed(boolean pressed) {
    fireButtonPressed();
}

protected void fireButtonPressed() {
    performAction(new MyButtonEvent(name));
}

您可以添加“监听”此事件的监听器/处理程序

private List<MyButtonListener> listeners = new ArrayList<>();

public void addMyButtonListener(MyButtonListener listener) {
    listeners.add(listener);
}

当传递此事件时,他们将执行回调

protected void performAction(MyButtonEvent event) {
    for (MyButtonListener listener : listeners) {
        listener.doButtonAction(event);   // doButtonAction === callback
    }
}

这里是使用的基本类(没有 GUI,只是一个简单的控制台应用程序示例)

我的按钮

public class MyButton {

    private List<MyButtonListener> listeners = new ArrayList<>();

    private boolean pressed;
    private String name;

    public MyButton(String name) {
        this.name = name;
    }

    public void setPressed(boolean pressed) {
        fireButtonPressed();
    }

    protected void fireButtonPressed() {
        performAction(new MyButtonEvent(name));
    }

    public void addMyButtonListener(MyButtonListener listener) {
        listeners.add(listener);
    }

    protected void performAction(MyButtonEvent event) {
        for (MyButtonListener listener : listeners) {
            listener.doButtonAction(event);
        }
    }
}

MYButtonListener

public interface MyButtonListener {
    public void doButtonAction(MyButtonEvent event);
}

我的按钮事件

public class MyButtonEvent {
    private String name;

    public MyButtonEvent(String name) {
        this.name = name;
    }
    public String getName() { return name; }
}

主要

public class Main {

    public static void main(String[] args) {
        MyButtonListener listener = new MyButtonListener() {
            @Override
            public void doButtonAction(MyButtonEvent event) {
                System.out.println(event.getName() + " pressed");
            }  
        };
        MyButton button = new MyButton("Hello Button");
        button.addMyButtonListener(listener);

        // change button state to cause event to be fired
        button.setPressed(true);
    }
}

这是一个过于简化的示例,但仍然演示了基本点。在 GUI 中,按下按钮将导致 pressed 状态发生变化,并且会发生与上面演示的类似的事件链。

您的特定问题也是如此。框架状态发生更改,并且您添加到其中的所有 ComponentListener 将调用其方法,并传递一个 ComponentEvent。根据状态变化,将调用回调方法。同样,在不查看任何源代码的情况下,在伪代码中,类似于:

for (ComponentListener listener : componentListeners) {
    if (changedState == Component.MOVED) {
        listener.componentMoved(componentEvent);
    }
}

关于java - 组件事件是如何被组件监听器捕获的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27470573/

相关文章:

java - 这个 Swing 代码是如何工作的?

java - 生成输出文本文件时扫描仪类错误

java - 将字符串转换为颜色 int

java - Spring 中的 Flyway DB 升级器

java - 正则表达式模式不匹配

Android - 如何在 Kotlin 中实现 setOnClickListener?

android - 如何将我的 Android 应用程序添加到共享对话框?

java - JTabbedPane 内 JFileChooser 上的 ActionListener

java - 画九格荡 Swing 不行吗?

java - 框架显示黑屏