Java - 创建自定义事件和侦听器

Posted

技术标签:

【中文标题】Java - 创建自定义事件和侦听器【英文标题】:Java - Create a Custom event and listener 【发布时间】:2018-08-28 03:41:33 【问题描述】:

我正在尝试用 Java 制作自定义事件和侦听器。我已经看过这些文章和问题:

Create a custom event in Java

Java custom event handler and listeners

https://www.javaworld.com/article/2077333/core-java/mr-happy-object-teaches-custom-events.html

但我仍然无法真正理解它。这就是我想要做的:

我有一个String 对象,它的内容会随着程序的运行而变化。我希望能够向字符串添加一个侦听器,该侦听器侦听它是否包含特定字符串以及何时运行一段代码。我想这样使用它:

String string = "";
//String.addListener() and textListener need to be created
string.addListener(new textListener("hello world") 
    @Override
    public void onMatch(
         System.out.println("Hello world detected");
    )


//do a bunch of stuff

string = "The text Hello World is used by programmers a lot"; //the string contains "Hello World", so the listener will now print out "Hello world detected"

我知道可能有更简单的方法可以做到这一点,但我想知道如何做到这一点。

感谢@Marcos Vasconcelos 指出您不能向String 对象添加方法,那么有没有办法可以使用@Ben 指出的自定义类?

【问题讨论】:

不能给String添加方法,可以添加到自己使用的类中 您可以使用 Kotlin 及其扩展来做到这一点。一个包装类和一个关于事件的 Java 101 教程应该在 Java 中完成。 您可以创建自己的类EventString(或其他),在其中有一个字符串对象,然后为它实现一个自定义事件监听器。 @Ben 我如何实现自定义事件监听器?正如我所说,在阅读了多个问题和文章后我仍然不太了解它 基本上,事件监听器并不神奇。为了让侦听器工作,您需要编写一种机制,在发生更改时触发事件。也就是说,您不能让程序直接分配给字符串 - 您必须通过该机制来完成。 【参考方案1】:

所以我做了一个最小的例子,也许会对你有所帮助:

你需要一个监听器接口:

public interface MyEventListener

    public void onMyEvent();

那么对于你的 String 你需要一些包装类来处理你的事件

public class EventString

    private String                  myString;

    private List<MyEventListener>   eventListeners;

    public EventString(String myString)
    
        this.myString = myString;
        this.eventListeners = new ArrayList<MyEventListener>();
    

    public void addMyEventListener(MyEventListener evtListener)
    
        this.eventListeners.add(evtListener);
    

    public void setValue(String val)
    
        myString = val;

        if (val.equals("hello world"))
        
            eventListeners.forEach((el) -> el.onMyEvent());
        
    

您会看到myString 字段是私有的,只能使用setValue 方法访问。这样我们就可以看到我们的事件条件何时触发。

然后你只需要这个的一些实现,例如:

EventString temp = new EventString("test");

temp.addMyEventListener(() -> 
    System.out.println("hello world detected");
);

temp.setValue("hello world");

【讨论】:

有没有一种方法可以在您拨打setValue 时不检查,而是不断检查?也许有一个while循环? 您可以随时触发事件。只需使用eventListeners.forEach((el) -&gt; el.onMyEvent()); 行。

以上是关于Java - 创建自定义事件和侦听器的主要内容,如果未能解决你的问题,请参考以下文章

Java AWT 图形界面编程事件处理机制 ① ( 事件处理步骤 | 创建事件源对象 -> 自定义事件监听器 -> 创建监听器实例对象 -> 事件源绑定事件监听器 )

Java 自定义事件处理程序和侦听器

java自定义事件,线程a如何每一秒钟触发一个事件,然后另一个线程b监听之,并作出反应?

创建自定义事件

从观察者模式谈论 : Spring Boot中创建发布和侦听自定义事件

使用动态组件和自定义事件时的 VueJS 警告