我想创建自定义事件并在视图的某些部分触发它们,以便视图的其他部分被更新/删除/刷新。
我尝试通过扩展 Component.Event 和 Component.Listener 但它不起作用。我认为事件和监听器必须限制在同一个组件实例中。
这可以用 Vaadin 7 完成吗?
基本上我想解耦我的视图并提供组件之间的轻松通信。我也在使用 Spring 和 Vaadin。如果您在观察者模式之外有更好的想法,我也将不胜感激。
谢谢
我想创建自定义事件并在视图的某些部分触发它们,以便视图的其他部分被更新/删除/刷新。
我尝试通过扩展 Component.Event 和 Component.Listener 但它不起作用。我认为事件和监听器必须限制在同一个组件实例中。
这可以用 Vaadin 7 完成吗?
基本上我想解耦我的视图并提供组件之间的轻松通信。我也在使用 Spring 和 Vaadin。如果您在观察者模式之外有更好的想法,我也将不胜感激。
谢谢
您需要:
1. 触发事件的组件
2. 自定义事件类
3. 侦听器接口
4. 以及侦听器实现
来自 1 的组件需要有一个事件监听器列表,以及方法addListener
:removeListener
; 和dispatchEvent
。-method将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 依赖。
您可以使用事件路由器。但我不使用它。
或者您可以使用 ObjectProperty。
此对象可以在值更改时触发事件。例如:
public class MyApplication extends UI{
private ObjectProperty<MyState> myState= new ObjectProperty<MyEvent>(new MyState());
public ObjectProperty<MyState> getMyState(){return myState;}
}
public class MyComponent1 extends VerticalLayout{
public MyComponent1(){
//create UI
....
updateData();
Property.ValueChangeListener updateListener = new Property.ValueChangeListener() {
@Override
public void valueChange(Property.ValueChangeEvent event) {
updateData();
}
};
MyApplication.getCurrent().getDispatcher().addValueChangeListener(updateListener);
}
private void updateData(){
MyState myState = MyApplication.getCurrent().getMyState().getValue();
//update this component with myState
}
}
public class MyComponent2 extends VerticalLayout{/*Similarly with Component1*/}
实际上,有一些基于 Vaadin 的框架可以解耦您的视图并提供简单的基于事件的通信,如您所说。这种方法称为 MVP 模式 -模型视图呈现器,它提供 event driver
组件之间的通信。当时有 som MVP Vaadin 框架可用: