1

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 项目(有很多匿名 ActionListener)上实现忙碌光标管理。因此,如果我必须将自己的代码(更改光标)添加到每个匿名用户actionPerformed(),我会发疯的。

有什么想法或建议吗?

4

3 回答 3

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。

于 2013-02-28T11:50:01.947 回答
2

如果您使用游标,请将其放在 finally 中。否则,如果出现问题,您将被困在沙漏上。

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

}
于 2013-02-28T16:05:12.477 回答
1

你可以实现一个包装器动作/监听器

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) {
      ...
    }
}

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

于 2013-02-28T12:05:44.607 回答