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()
,我就疯了。
有任何想法或建议吗?
答案 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 ...)报告为委托的值,并侦听委托属性的更改并根据需要通知其侦听器。