繁体   English   中英

在 Java 中创建自定义事件

[英]Create a custom event in Java

我想在 Java 中做这样的事情,但我不知道怎么做:

当事件“object 1 say 'hello'”发生时,object 2 通过说“hello”响应该事件。

有人可以给我一个提示或示例代码吗?

您可能想研究观察者模式

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

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

相关文章: Java:创建自定义事件

您想要的是观察者模式的实现。 您可以完全自己做,也可以使用java.util.Observerjava.util.Observable等 java 类

您可能希望通过 3 种不同的方式进行设置:

  1. Catcher内的Thrower
  2. Thrower内的Catcher
  3. 在此示例Test中,另一个 class 内的ThrowerCatcher

工作 GITHUB 示例我引用默认为选项 3,尝试其他简单地取消注释 class 的“ Optional ”代码块你想成为主要的,并将 ZA2F2ED4F8EBC2CBB4C21A29DZ 中的 ZA2F2ED4F8EBC2CBB4C21A29D4 变量设置为${Main-Class} D4 变量build.xml文件:

抛出侧代码需要的 4 件事:

import java.util.*;//import of java.util.event

//Declaration of the event's interface type, OR import of the interface,
//OR declared somewhere else in the package
interface ThrowListener {
    public void Catch();
}
/*_____________________________________________________________*/class Thrower {
//list of catchers & corresponding function to add/remove them in the list
    List<ThrowListener> listeners = new ArrayList<ThrowListener>();
    public void addThrowListener(ThrowListener toAdd){ listeners.add(toAdd); }
    //Set of functions that Throw Events.
        public void Throw(){ for (ThrowListener hl : listeners) hl.Catch();
            System.out.println("Something thrown");
        }
////Optional: 2 things to send events to a class that is a member of the current class
. . . go to github link to see this code . . .
}

class 文件中需要 2 个东西来接收来自 class 的事件

/*_______________________________________________________________*/class Catcher
implements ThrowListener {//implement added to class
//Set of @Override functions that Catch Events
    @Override public void Catch() {
        System.out.println("I caught something!!");
    }
////Optional: 2 things to receive events from a class that is a member of the current class
. . . go to github link to see this code . . .
}

下面不完全一样但是类似,我在找一个片段来添加对接口方法的调用,但是发现了这个问题,所以我决定添加这个片段给那些像我一样搜索它并找到这个问题的人:

 public class MyClass
 {
        //... class code goes here

        public interface DataLoadFinishedListener {
            public void onDataLoadFinishedListener(int data_type);
        }

        private DataLoadFinishedListener m_lDataLoadFinished;

        public void setDataLoadFinishedListener(DataLoadFinishedListener dlf){
            this.m_lDataLoadFinished = dlf;
        }



        private void someOtherMethodOfMyClass()
        {
            m_lDataLoadFinished.onDataLoadFinishedListener(1);
        }    
    }

用法如下:

myClassObj.setDataLoadFinishedListener(new MyClass.DataLoadFinishedListener() {
            @Override
            public void onDataLoadFinishedListener(int data_type) {
                }
            });

术语

  • 听众是观察者/处理者
  • dispatcher 是主题/观察者容器

通常,当人们实现观察者模式时,他们要求调度程序存在,然后任何侦听器才能订阅它。 但是有一种更好的方法叫做Signals

Signals是一个事件库。 它通过引入允许注册侦听器和调度事件的信号 object 来分离调度程序的侦听器。 信号是通过代理从接口自动创建的。 它负责管理侦听器的所有样板代码,此外还添加了一些不错的糖代码 API。

监听器 -> 信号 <- 调度器

interface Chat{
    void onNewMessage(String s);    
}

class Foo{
    Signal<Chat> chatSignal = Signals.signal(Chat.class);
    
    void bar(){
        chatSignal.addListener( s-> Log.d("chat", s) ); // logs all the messaged to Logcat
    }
}

class Foo2{
    Signal<Chat> chatSignal = Signals.signal(Chat.class);
    
    void bar2(){
        chatSignal.dispatcher.onNewMessage("Hello from Foo2"); // dispatches "Hello from Foo2" message to all the listeners
    }
}

在本例中,信号是从Chat界面自动创建的。 它允许Foo为其注册,而Foo2无需交互即可发送新消息。

免责声明:我是 Signals 的作者。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM