在Java中创建自定义监听器

14

我想知道如何创建自己的监听器,并且能够像其他监听器一样使用它。

public interface Listener {

    public void onListen(Event e);

}

然后在我的类中加入这个

public class test implements Listener {

    Object.add(new Listener() { 

        @Override
        public void onListen(Event e) {

        }
    });
}
我想我真正想问的是,在哪里定义如何检查与我创建的监听器相关的事件?
如果有任何不明白的地方,请告诉我,我会澄清。
如果这听起来最好没有意义,我可以尝试解释一下。 我该如何创建一个监听器来检查组合框中选定的选项是否已更改为另一个选项。 我实际上不需要组合框侦听器,那只是一个示例。

1
实际上,你的问题还没有意义。你是在问如何将你的监听器注册到某个东西吗?还是如何在相关时间调用监听器?或者是其他什么问题? - Oliver Charlesworth
2
@Pjrat111:你所提到的例子在Java Swing教程中有详细解释:http://docs.oracle.com/javase/tutorial/uiswing/components/combobox.html#listeners。 - Oliver Charlesworth
1
Java UI组件已经使用了这个模型,并且有适当的接口可以实现你所要求的功能。教程会解释如何使用它们。如果你想知道它是如何工作的,观察者模式是一个很好的起点。 - Brian Roach
1
我明白这一点,但实际上我并不需要一个组合框或任何Swing组件的监听器,我只是想学习监听器的工作原理。感谢@Brian Roach提供的观察者模式链接。 - Pjrat111
@Pjrat111 - 还可以参考Java类http://docs.oracle.com/javase/6/docs/api/java/util/Observer.html和http://docs.oracle.com/javase/6/docs/api/java/util/Observable.html - Brian Roach
显示剩余2条评论
2个回答

16

以下是一个简短的示例:

    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();
    }

3
请参阅EventListenerList - trashgod
1
@trashgod,谢谢你的提示。这不是很容易理解。我发现这个链接很有帮助:http://www.java2s.com/Tutorial/Java/0260__Swing-Event/ManagingListenerListswithEventListenerList.htm。 - qben

1

创建所需的监听器并不困难,但只能将其应用于期望它的类(因此您不能执行 (new Object()).addMyListener)。

您需要在要使用监听器的类中添加一个 addMyListener(MyListener myListener) 方法。它只是将您传递给它的监听器存储在列表中以供以后使用。最好创建一个带有 addMyListener 方法(和一个 fireMyListeners() 方法)的接口。

当然,您还必须提供调用 fireMyListeners() 方法的代码。然后,fireMyListeners() 将只循环遍历监听器并调用它们的通知方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接