我只是想知道是否有任何回调方法,或者我们是否可以在java中为动作侦听器创建一些回调(比方说:beforeAction(),afterAction()等...),就像我们在Javascript中有一些回调一样,如:
beforeFilter(), afterFilter() etc...
我已经用Google搜索了这个主题,但没有找到我到底要找的东西。 我也想到了类似的东西:
public void actionPerformed(ActionEvent e) {
beforeAction();
actuallAction();
afterAction();
}
我们应该将这些方法视为回调???
任何帮助将不胜感激。 感谢。
编辑:是的,我在询问java swing。
答案 0 :(得分:1)
首先,对有序侦听器执行的需求可能是设计问题/错误的指示器,因为通常的侦听器不应该有任何因果依赖性。因此,请先审核您的设计。
如果您仍然坚持使用分阶段监听器,那么您需要的只是某种“暂存”动作监听器适配器,它将ActionEvent
委托给三个不同的监听器组(“阶段”):
public class StagedActionEventSource implements ActionListener {
public static StagedActionEventSource forButton(Button button) {
StagedActionEventSource l = find(button.getActionListeners());
if (l == null) {
l = new StagedActionEventSource();
button.addActionListener(l);
}
return l;
}
public static StagedActionEventSource forList(List list) {
StagedActionEventSource l = find(list.getActionListeners());
if (l == null) {
l = new StagedActionEventSource();
list.addActionListener(l);
}
return l;
}
// ... add more widget-based implementations here ...
private static StagedActionEventSource find(ActionListener[] listeners) {
for (ActionListener l : listeners) {
if (l instanceof StagedActionEventSource)
return (StagedActionEventSource) l;
}
return null;
}
private ActionListener beforeActionRoot;
private ActionListener onActionRoot;
private ActionListener afterActionRoot;
public void addBeforeActionListener(ActionListener l) {
beforeActionRoot = AWTEventMulticaster.add(beforeActionRoot, l);
}
public void removeBeforeActionListener(ActionListener l) {
beforeActionRoot = AWTEventMulticaster.remove(beforeActionRoot, l);
}
public void addActionListener(ActionListener l) {
onActionRoot = AWTEventMulticaster.add(onActionRoot, l);
}
public void removeActionListener(ActionListener l) {
onActionRoot = AWTEventMulticaster.remove(onActionRoot, l);
}
public void addAfterActionListener(ActionListener l) {
afterActionRoot = AWTEventMulticaster.add(afterActionRoot, l);
}
public void removeAfterActionListener(ActionListener l) {
afterActionRoot = AWTEventMulticaster.remove(afterActionRoot, l);
}
@Override
public void actionPerformed(ActionEvent e) {
fireEvent(beforeActionRoot, e);
fireEvent(onActionRoot, e);
fireEvent(afterActionRoot, e);
}
private void fireEvent(ActionListener root, ActionEvent e) {
if (root != null) {
root.actionPerformed(e);
}
}
}
请注意,只有在通过此适配器注册所有您的侦听器时,此概念才有效。当然,仍然可以直接在组件上注册一个监听器,但是这个监听器不会参与分阶段事件调度 - 而是在监听器在StagedEventSource
注册之前或之后调用。
用法:
Button button = new Button(...);
StagedActionEventSource.forButton(button)
.addBeforeActionListener(new MyActionListener());
StagedActionEventSource.forButton(button)
.addActionListener(new MyActionListener());