这是捕获指定组件事件的方法:
public void componentHidden(ComponentEvent e) {
displayMessage(e.getComponent().getClass().getName() + " --- Hidden");
}
public void componentMoved(ComponentEvent e) {
displayMessage(e.getComponent().getClass().getName() + " --- Moved");
}
当我更改框架的大小或移动它时,会调用相应的方法。我没有看到任何特定的代码,如果帧移动,监听器调用componentHidden;或者如果调整框架大小,则调用componentMoved。那么,侦听器如何在捕获它们时对组件事件进行分类,以便调用相应的方法?
答案 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);
}
}