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 プロジェクト (多くの匿名の ActionListeners を使用) に実装しようとしています。したがって、すべての匿名actionPerformed()に独自のコードを追加する (カーソルを変更する) 必要があるとしたら、気が狂ってしまいます。

アイデアや提案はありますか?

4

3 に答える 3

2

カーソルを使用している場合は、finally に入れます。そうしないと、何か問題が発生した場合に砂時計で立ち往生することになります。

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

}
于 2013-02-28T16:05:12.477 に答える
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 に答える
1

You could implement a wrapper 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) {
      ...
    }
}

Note: for an action this is incomplete, it must report its values (like enabled, name ...) as the delegate's values and listen to changes of the delegate properties and notify its listeners as needed.

于 2013-02-28T12:05:44.607 に答える