我想创建自定义事件并在 View 的某些部分触发它们,以便更新/删除/刷新 View 的其他部分。
我尝试过扩展 Component.Event 和 Component.Listener,但它不起作用。我认为事件和监听器必须限制在同一个组件实例中。
这可以用 Vaadin 7 完成吗?
基本上我想解耦我的 View 并提供组件之间的简单通信。我也在使用 Spring 和 Vaadin。如果您对观察者模式有更好的想法,我也将不胜感激。
谢谢
最佳答案
你需要什么:
1. 触发事件的组件
2.自定义事件类
3. 监听接口(interface)
4. 和监听器实现
1 中的组件需要有一个事件监听器列表,方法:addListener
; 移除监听器
;和 dispatchEvent
。 dispatchEvent
方法将遍历事件监听器列表并执行某些方法(参见 4:监听器实现)。该方法有一个事件对象作为参数(参见 2:自定义事件类)。
1的基本代码:
protected List<MyListener> listeners;
protected synchronized void dispatchEvent(MyEvent event) {
if (listeners != null) {
for (MyListener listener : listeners) {
listener.myMethod(event);
}
}
}
public synchronized void addListener(MyListener listener) {
if (listeners == null) {
listeners = new ArrayList<MenuListener>();
}
listeners.add(listener);
}
public synchronized void removeListener(MyListener listener) {
if (listeners == null) {
listeners = new ArrayList<MyListener>();
return;
}
listeners.remove(listener);
}
2 的基本代码:
public class MyEvent {
protected String eventType;
public MyEvent(String eventType) {
this.eventType = eventType;
}
//getters and setters
}
3 的基本部分:
public interface MyListener {
public void doSomething(MyEvent event);
}
代码4(监听器实现)
public class MyImplementation implements MyListener {
@Override
public void doSomething(myEvent event) {
//do something concretes here
}
}
代码流的工作原理:
在一些交互之后,调度程序类将向每个事件监听器“宣布”发生了某事。
dispatchEvent(new MyEvent("ADD_USER"));
在要接收事件的类中需要实例化调度器类和监听器实现类,并将监听器添加到调度器列表中:
MyDispatcher disp = new MyDispatcher();
MyImplementation myImpl = new MyImplementation();
// Then add the event-listener to the dispatcher:
disp.addListener(myImpl);
当然,其中一些类可以是内部类,代码可以简化或扩展,但这是总体思路。这也只是普通的 Java,不依赖于 Vaadin。
关于java - Vaadin 7 在组件之间触发自定义事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18364610/