Actionlistener在java中的回调

时间:2015-02-04 13:43:06

标签: java callback

我只是想知道是否有任何回调方法,或者我们是否可以在java中为动作侦听器创建一些回调(比方说:beforeAction(),afterAction()等...),就像我们在Javascript中有一些回调一样,如:

beforeFilter(), afterFilter() etc...

我已经用Google搜索了这个主题,但没有找到我到底要找的东西。 我也想到了类似的东西:

public void actionPerformed(ActionEvent e) {
      beforeAction();
      actuallAction();
      afterAction();
}

我们应该将这些方法视为回调???

任何帮助将不胜感激。 感谢。

编辑:是的,我在询问java swing。

1 个答案:

答案 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());