组件事件如何被组件侦听器捕获

时间:2014-12-14 15:02:15

标签: 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");
}

当我更改框架的大小或移动它时,会调用相应的方法。我没有看到任何特定的代码,如果帧移动,监听器调用componentHidden;或者如果调整框架大小,则调用componentMoved。那么,侦听器如何在捕获它们时对组件事件进行分类,以便调用相应的方法?

1 个答案:

答案 0 :(得分:2)

在没有进入任何源代码的情况下,基本的事件处理模型大部分都是这样的:

你有一个组件。该组件有一些状态。

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,只是一个简单的控制台应用程序示例)

<强> myButton的

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);
}

<强> MyButtonEvent

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。根据哪个状态更改,这将是调用的回调方法。再次,不用任何源代码,在psuedocode中,类似:

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