我希望创建自定义事件,并在视图的某些部分激发它们,以便更新/删除/刷新视图的其他部分。
我尝试过扩展Component.Event和Component.Listener,但是它不起作用。我认为事件和侦听器必须限于同一个组件实例。
可以用Vaadin 7?来完成吗?
基本上,我希望将我的视图解耦,并在组件之间提供轻松的通信。我也在使用Spring和Vaadin。如果你有更好的想法,除了观察者模式,我也会感谢它。
谢谢
发布于 2013-08-21 19:29:45
您需要的:
来自1的组件需要有一个事件侦听器列表,以及方法:addListener;removeListener;和dispatchEvent。dispatchEvent-method将遍历事件侦听器列表并执行某些方法(参见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
}第三部分的基本部分:
public interface MyListener {
public void doSomething(MyEvent event);
}4的代码(侦听器实现)
public class MyImplementation implements MyListener {
@Override
public void doSomething(myEvent event) {
//do something concretes here
}
}代码流如何工作:
在一些交互之后,dispatcher类将向每个事件侦听器“宣布”发生了一些事情。
dispatchEvent(new MyEvent("ADD_USER"));在要接收事件的类中,需要实例化dispatcher类和listener实现类,并将侦听器添加到dispatcher的列表中:
MyDispatcher disp = new MyDispatcher();
MyImplementation myImpl = new MyImplementation();
// Then add the event-listener to the dispatcher:
disp.addListener(myImpl);当然,其中一些类可以是内部类,代码可以简化或扩展,但这是一般的想法。这也只是普通的Java,不依赖于Vaadin。
发布于 2013-08-22 08:54:17
实际上,有一些基于Vaadin的框架可以将您的视图解耦,并提供您所说的基于事件的简单通信。这种方法称为MVP模式- 模型视图演示器,它提供组件之间的event driver通信。当时有som MVP Vaadin框架可供使用:
发布于 2014-12-12 18:20:05
您可以使用EventRouter。但我不使用它。
或者你可以使用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*/}https://stackoverflow.com/questions/18364610
复制相似问题