【问题标题】:How to create custom Listeners in java?如何在 java 中创建自定义监听器?
【发布时间】:2011-10-19 22:59:05
【问题描述】:

我想知道如何在 java 中设置我们自己的侦听器。例如,我有一个将数字从 1 递增到 100 的函数。我想在值达到 50 时设置一个侦听器。我该怎么做?请建议我任何教程。

【问题讨论】:

标签: java interface listener observer-pattern


【解决方案1】:

查看任何使用监听器的类的源代码。其实很简单:

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

关于观察者模式以及一些 Java 代码,请查看 wikipedia

【讨论】:

    【解决方案2】:

    没有允许您将侦听器附加到所有变量的内置机制。您要观看的对象需要自己提供支持。例如,它可以变为 Observable 并向其观察者触发 onChange 事件(您还必须确保正在跟踪)。

    【讨论】:

      【解决方案3】:

      我建议您将EventBus 用于您的用例。它有一个很好的 API 设计并且易于使用。看看他们的Getting Started 部分,看看它是如何工作的。

      【讨论】:

      【解决方案4】:

      https://stackoverflow.com/a/6270150/3675925

      您可能想查看observer pattern

      这里有一些示例代码可以帮助您入门:

      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..."
          }
      }
      

      【讨论】:

      【解决方案5】:

      您可以为此使用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 的作者。

      【讨论】:

        猜你喜欢
        • 2011-10-19
        • 2011-08-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-22
        相关资源
        最近更新 更多