说到事件,我肯定来自ActionScript背景。我目前正在使用Swing处理一个项目,其中我需要从一个对象调度事件并在父对象中捕获事件,我不知道如何做到这一点。
在ActionScript3中,您可以使用dispatchEvent调用分派事件。例如,假设我想以编程方式调度mouseClick事件(即使没有单击鼠标),以便激活其他侦听器。我可以使用
dispatchEvent(MouseEvent.Click);
一旦被调用,事件将通过它的父对象向上冒泡,直到到达顶部,事件侦听器可以在此过程中捕获它。(从技术上讲,它会下降并回升,但我相信这超出了问题的范围)。如果我想监听父对象中的mouseClick事件,我只需添加这样一个监听器:
parent.addEventListener(MouseEvent.Click, Function);
它将捕获mouseClick并执行Function
这就是它在ActionScript3中的工作方式。我正在尝试在Java中做类似的事情,Java事件的工作方式似乎有一些重大的理论变化。我如何在java中做同样的事情?具体来说,我如何以编程方式调度事件并在父对象中捕获该事件?
我对这个问题做了自己的研究,它只会让我更加困惑。我看过:- 我如何编程发送ActionEvent到JButton?
- Swing中的并发——事件调度线程。 事件和监听器——如何创建自定义事件?
对于以编程方式触发事件,如果您在按钮外部,请查看AbstractButton.doClick()
,或者最好是子类中的AbstractButton.fireActionPerformed()
。
在开发组件时,缺少冒泡意味着每个父组件都需要处理和重新分配子组件事件:
innerButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent buttonEvent) {
MyEvent myEvent = ... // process buttonEvent
fireMyEventHappened(myEvent);
}
});
Component
类有一个dispatchEvent(...)
方法,所以你可以直接创建和分派一个事件给任何组件。
或者如果你想手动生成一个OS事件,那么你可以使用Robot
类,Java将为你完成事件的调度。在本例中