Vaadin 7组件之间的自定义事件

我想创建自定义事件并在视图的某个部分触发它们,以便更新/删除/刷新视图的其他部分。

我已经尝试通过扩展Component.Event和Component.Listener,但它不起作用。 我认为事件和监听器必须限于同一个组件实例。

这可以用Vaadin 7完成吗?

基本上我想要分离我的观点并提供组件之间的轻松沟通。 我也在和Vaadin一起使用Spring。 如果你在观察者模式旁边有更好的想法,我也会很感激。

谢谢

你需要什么:
1.发射事件的组件
2.自定义事件类
3.一个监听器接口
4.听众实施

1中的组件需要有一个事件监听器列表,以及方法: addListener ; removeListener ; 和dispatchEventdispatchEvent -method将迭代事件监听器列表并执行一些方法(参见4:监听器实现)。 该方法具有事件对象作为参数(参见2:自定义事件类)。

1的基本代码:

 protected List 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(); } listeners.add(listener); } public synchronized void removeListener(MyListener listener) { if (listeners == null) { listeners = new ArrayList(); 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的东西。

实际上,正如你所说,有一些基于Vaadin的框架可以解耦你的视图并提供简单的基于事件的通信。 这种方法称为MVP模式 – 模型视图展示器 ,它提供组件之间的event driver通信。 当时有可用的MVP Vaadin框架:

https://github.com/peholmst/MVP4Vaadin

https://github.com/panter/org.vaadin.mvp

您可以使用EventRouter。 但我不使用它。

或者您可以使用ObjectProperty。

更改值时,此对象可以触发事件。 例如:

 public class MyApplication extends UI{ private ObjectProperty myState= new ObjectProperty(new MyState()); public ObjectProperty 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*/}