拥有匿名实现的ActionListener? (忙碌的光标)

时间:2013-02-28 11:19:09

标签: java swing cursor actionlistener anonymous-class

ActionListeners(带有匿名实现)通常添加如下:

someobject.addActionListener(new ActionListener(){
    public void actionPerformed(ActionEvent ae){
        ...
    }
});

但是我想在每个'actionPerformed'事件之前和之后执行我自己的代码。假设我在自己的类中实现ActionListener接口,如:

public class MyOwnActionListener implements ActionListener{
    public void actionPerformed(final ActionEvent ae) {
        // own code
            super.actionPerformed(ae); // I know, this makes no sense, cause ActionListener is an interface
        // own code
    }
}

我希望能够做到这样的事情:

someobject.addActionListener(new MyOwnActionListener(){
    public void actionPerformed(ActionEvent ae){
        ...
    }
});

在我的班级中,应该执行匿名actionPerformed内的代码而不是super.actionPerformed(ae);。我知道,我不能为MyOwnActionListener提供一个匿名实现,因为它是一个类而不是一个接口而且super.actionPerformed(ae);不起作用,因为我想调用继承类的方法,而不是超类 - 但我怎样才能重新设计我的代码以尽可能少地改变ActionListener的匿名实现?

背景: 我正在尝试在一个非常庞大的Java项目上实现繁忙的游标管理(有很多匿名的ActionListeners)。所以,如果我必须将自己的代码(更改光标)添加到每个匿名actionPerformed(),我就疯了。

有任何想法或建议吗?

3 个答案:

答案 0 :(得分:2)

尝试;

public abstract class MyOwnActionListener implements ActionListener{
    @Override
    public void actionPerformed(final ActionEvent ae) {
        // own code
        doActionPerformed(ae); 
        // own code
    }

    protected abstract void doActionPerformed(ActionEvent ae);
}

然后在子类中实现doActionPerformed。

答案 1 :(得分:2)

如果您正在使用游标,请将其放入最终版本中。否则,如果出现问题,你将被困在沙漏上。

@Override
public void actionPerformed(ActionEvent e) {
    try {
        doBefore(e);
        delegate.actionPerformed(e);
    }finally {
        doAfter(e);
    }

}

答案 2 :(得分:1)

您可以实现包装器Action / Listener

public WrapperAction extends AbstractAction {

    private Action delegate;

    public WrapperAction(Action delegate) {
       this.delegate = delegate;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        doBefore(e)
        delegate.actionPerformed(e);
        doAfter(e);
    }

    protected void doBefore(ActionEvent e) {
      ...
    }

    protected void doAfter(ActionEvent e) {
      ...
    }
}

注意:对于不完整的操作,它必须将其值(如enabled,name ...)报告为委托的值,并侦听委托属性的更改并根据需要通知其侦听器。