这是捕获指定组件事件的方法:
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/