我是.Net开发人员.我想知道Java中是否有像C#这样的事件处理的事件处理机制.
我想要做的是我想在某些条件下从我的班级中筹集/开火.此类的消费者应该注册该事件并编写事件处理方法.
这可以在C#中轻松完成.我必须用Java实现这个功能.
谷歌搜索后我找到了一些链接,但所有这些都在谈论AWT和摇摆中的GUI事件.
谁能帮我吗.
Jon*_*eet 28
虽然大多数示例都与GUI事件有关,但原理基本相同.您基本上需要一个接口或抽象类来表示事件的处理程序,例如
public interface EventHandler
{
// Change signature as appropriate of course
void handleEvent(Object sender, EventArgs e);
}
Run Code Online (Sandbox Code Playgroud)
然后该活动的发布者将:
public void addEventHandler(EventHandler handler)
public void removeEventHandler(EventHandler handler)
Run Code Online (Sandbox Code Playgroud)
它可以保留事件处理程序本身的列表,也可以将它们封装在可重用的类型中.然后,当事件发生时,您只需handleEvent
依次调用每个处理程序.
您可以将C#中的委托类型视为与Java中的单方法接口非常相似,而事件实际上只是一对添加/删除方法.
Jos*_*ush 10
它们使用简单,方便.我在java中错过了它们所以写了一个小实用程序类,它模仿了C#的基础知识Event
.
+=
操作员,而是打电话.addListener((x) -> ...)
.broadcast(<EventArgs insance>)
在线演示 - https://repl.it/DvEo/2
Event.java
import java.util.HashSet;
import java.util.Set;
import java.util.function.Consumer;
public class Event {
private Set<Consumer<EventArgs>> listeners = new HashSet();
public void addListener(Consumer<EventArgs> listener) {
listeners.add(listener);
}
public void broadcast(EventArgs args) {
listeners.forEach(x -> x.accept(args));
}
}
Run Code Online (Sandbox Code Playgroud)
com.google.common.collect.Sets.newConcurrentHashSet()
线程安全EventArgs.java
public class EventArgs {
}
Run Code Online (Sandbox Code Playgroud)
Java通过各种事件处理实现提供支持 - java.util中的简单Observer/Observable ,java.beans 中的PropertyChangeEvent以及从AWTEvent继承的GUI事件.
一个可观察对象具有实现观察者的列表观察员用于添加和删除观察员接口和机制.如果o.notifyObservers(x)
在observable update(o,x)
上调用,则会在每个观察者上调用.这种机制在某种程度上是老式的,很少用在新代码中 - 它在Java 1.1中添加EventObject之前就是Java 1.0,并且为AWT和bean添加了更好的事件处理.
Bean和GUI事件传播一个对象,该对象将java.util.EventObject扩展到实现EventListener子接口的侦听器.通常,如果您使用的是现有API,则只关注该API的事件和侦听器,但如果您要定义API,则事件和侦听器应遵循该约定.
它也是Java API中的约定,用于调用事件"侦听器"而不是处理程序的处理程序,并且所有侦听器接口名称都以此结束Listener
.方法的名称不是以'on'开头,而应该是过去时 - mouseMoved
或者 handshakeCompleted
不是onMouseMove
或handleMouseMove
.
所述的PropertyChangeSupport类提供机构用于从豆中添加和删除侦听器的实现,并且也用于Swing小部件的性能.
如果您编写自己的侦听器处理,那么允许侦听器通过source.removeXXXListener(this)
在其事件处理方法中调用来移除自己是常规的.只需迭代一个简单的侦听器集合并调用它们的处理方法就可以ConcurrentModificationException
在这些情况下提供 - 您需要复制侦听器集合或使用可同时修改的集合.