web-dev-qa-db-ja.com

Java)でカスタムリスナーを作成する

何かのために自分のリスナーを作成し、他のリスナーと同じようにそれを使用できるようにするにはどうすればよいのだろうかと思っていました。

public interface Listener {

    public void onListen(Event e);

}

そしてこれは私のクラスで

public class test implements Listener {

    Object.add(new Listener() { 

        @Override
        public void onListen(Event e) {

        }
    });
}

私が本当に求めているのは、私が作成したリスナーに関連して何かが起こったかどうかを確認する方法をどこで定義するかということでもあると思います。

これが意味をなさない場合は、教えてください。明確にします。

せいぜいこれがあなたにとって意味がないなら、私はこれを試してみます。コンボボックスで選択したオプションが別のオプションに変更されたかどうかをリスナーに確認させるにはどうすればよいですか。実際にはコンボボックスリスナーは必要ありませんが、それは単なる例です。

14
Pjrat111

これが短い例です:

    private static class Position {
    }

    private static class Ball {
        private ArrayList<FootballObserver> observers = new ArrayList<FootballObserver>();
        private Position ballPosition = new Position();

        public void registerObserver(FootballObserver observer) {
            observers.add(observer);
        }

        public void notifyListeners() {
            for(FootballObserver observer : observers) {
                observer.notify(ballPosition);
            }
        }

        public void doSomethingWithFootballPosition() {
            //bounce etc
            notifyListeners();
        }
    }

    private static interface FootballObserver {
        void notify(Position ball);
    }

    private static class Player implements FootballObserver {
        public void notify(Position ball) {
            System.out.println("received new ball position");
        }
    }

    public static void main(String... args) {
        FootballObserver player1 = new Player();
        Ball football = new Ball();
        football.registerObserver(player1);
        football.doSomethingWithFootballPosition();
    }
17
Sebastian

必要なリスナーを作成するのに問題はありませんが、それを期待するクラスにのみ適用できます(したがって、_(new Object()).addMyListener_を実行することはできません)

リスナーを使用するクラスにaddMyListener(MyListener myListener)メソッドを追加する必要があります。渡したリスナーを後のユーザーのためにリストに保存するだけです。 addMyListenerメソッド(およびfireMyListeners())メソッドを使用してインターフェイスを作成することをお勧めします。

もちろん、fireMyListeners()メソッドを呼び出すコードも提供する必要があります。次に、fireMyListeners()はリスナーをループして、リスナーの通知メソッドを呼び出します。

1
SJuan76