gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 05:09:15 26 4
gpt4 key购买 nike

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

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com