如何在Java中创建自定义监听器?

41

我想了解如何在Java中设置自己的监听器。例如,我有一个将数字从1增加到100的函数。当该值达到50时,我想设置一个监听器。我该如何做?请给我推荐任何教程。


3
相关内容:在Java中创建自定义事件 - Lucio
有一篇很好的文章供您参考: https://dev59.com/UW025IYBdhLWcg3wAg_p - WolfArya
5个回答

33

https://dev59.com/UW025IYBdhLWcg3wAg_p#6270150

你可能想要了解观察者模式
以下是一些示例代码,可供参考:
import java.util.*;

// An interface to be implemented by everyone interested in "Hello" events
interface HelloListener {
    void someoneSaidHello();
}

// Someone who says "Hello"
class Initiater {
    private List<HelloListener> listeners = new ArrayList<HelloListener>();

    public void addListener(HelloListener toAdd) {
        listeners.add(toAdd);
    }

    public void sayHello() {
        System.out.println("Hello!!");

        // Notify everybody that may be interested.
        for (HelloListener hl : listeners)
            hl.someoneSaidHello();
    }
}

// Someone interested in "Hello" events
class Responder implements HelloListener {
    @Override
    public void someoneSaidHello() {
        System.out.println("Hello there...");
    }
}

 

class Test {
    public static void main(String[] args) {
        Initiater initiater = new Initiater();
        Responder responder = new Responder();

        initiater.addListener(responder);

        initiater.sayHello();  // Prints "Hello!!!" and "Hello there..."
    }
}

3
以下是对于如何在Java中创建自定义事件的翻译:Java中创建自定义事件的步骤如下:
  1. 创建一个类来表示该事件(通常继承自java.util.EventObject)。
  2. 在包含事件处理代码的类中添加一个方法,该方法负责将事件对象实例化并将其传递给所有侦听器。
  3. 为事件添加侦听器,以便它们可以响应该事件。
以下是示例代码:import java.util.EventObject; // Step 1: Create a class to represent the event class MyEvent extends EventObject { public MyEvent(Object source) { super(source); } } // Step 2: Add code to fire the event class EventSource { private List listeners = new ArrayList(); public void addListener(MyEventListener listener) { listeners.add(listener); } public void removeListener(MyEventListener listener) { listeners.remove(listener); } public void fireEvent() { MyEvent event = new MyEvent(this); for (MyEventListener listener : listeners) { listener.handleMyEvent(event); } } } // Step 3: Add listeners to respond to the event interface MyEventListener extends EventListener { void handleMyEvent(MyEvent event); } class EventListenerImpl implements MyEventListener { public void handleMyEvent(MyEvent event) { System.out.println("Event occurred: " + event.getSource()); } } public class Main { public static void main(String[] args) { EventSource source = new EventSource(); source.addListener(new EventListenerImpl()); source.fireEvent(); } }
- Eren

26

查看任何使用监听器的类的源代码都很容易:

  • 为您的监听器创建一个接口,例如MyListener
  • 维护MyListener列表
  • 在每个监听器应该监听的事件上,遍历列表并使用一些事件参数调用适当的方法

至于观察者模式和一些Java代码,请参阅维基百科


0
你可以使用Signals库来实现它。代码如下:
interface FiftySignal{
    void on50();
}

class FiftyMaker{
    FiftySignal fiftySignal = Signals.signal(FiftySignal.class).dispatcher;

    void doIt(){
        for(int i = 0; i < 100; i++){
            if(i == 50){
                fiftySignal.on50(); // dispatching the event
            }
        }   
    }
}

class Boo{
    Signal<FiftySignal> fiftySignal = Signals.signal(FiftySignal.class);


    void bar(){
         fiftySignal.addListener(()-> System.out.println("It's 50!")); // listener
    }
}

声明:我是Signals的作者。


0

没有内置机制可以让你附加监听器到所有变量。你想要监视的对象需要自己提供支持。例如,它可以成为可观察对象,并向其观察者触发onChange事件(你也必须确保正在跟踪这些观察者)。


0

我建议您在这种情况下使用EventBus。它具有良好的API设计,易于使用。请查看他们的Getting Started部分以了解其工作原理。


在2020年,链接为https://github.com/greenrobot/EventBus。 - randmin

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