首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Vaadin 7在组件之间触发自定义事件

Vaadin 7在组件之间触发自定义事件
EN

Stack Overflow用户
提问于 2013-08-21 18:03:00
回答 3查看 8.1K关注 0票数 3

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

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

可以用Vaadin 7?来完成吗?

基本上,我希望将我的视图解耦,并在组件之间提供轻松的通信。我也在使用Spring和Vaadin。如果你有更好的想法,除了观察者模式,我也会感谢它。

谢谢

EN

回答 3

Stack Overflow用户

发布于 2013-08-21 19:29:45

您需要的:

  1. 触发事件的组件。
  2. 自定义事件类
  3. 监听器接口
  4. 以及侦听器实现

来自1的组件需要有一个事件侦听器列表,以及方法:addListenerremoveListener;和dispatchEventdispatchEvent-method将遍历事件侦听器列表并执行某些方法(参见4:侦听器实现)。该方法有一个事件对象作为参数(参见2:自定义事件类)。

1的基本代码:

代码语言:javascript
复制
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的基本代码:

代码语言:javascript
复制
public class MyEvent {
   protected String eventType;

   public MyEvent(String eventType) {
      this.eventType = eventType;
   }

   //getters and setters
}

第三部分的基本部分:

代码语言:javascript
复制
public interface MyListener {
    public void doSomething(MyEvent event);
}

4的代码(侦听器实现)

代码语言:javascript
复制
public class MyImplementation implements MyListener {

    @Override
    public void doSomething(myEvent event) {
        //do something concretes here
    }
}

代码流如何工作:

在一些交互之后,dispatcher类将向每个事件侦听器“宣布”发生了一些事情。

代码语言:javascript
复制
dispatchEvent(new MyEvent("ADD_USER"));

在要接收事件的类中,需要实例化dispatcher类和listener实现类,并将侦听器添加到dispatcher的列表中:

代码语言:javascript
复制
MyDispatcher disp = new MyDispatcher();
MyImplementation myImpl = new MyImplementation();
// Then add the event-listener to the dispatcher:
disp.addListener(myImpl);

当然,其中一些类可以是内部类,代码可以简化或扩展,但这是一般的想法。这也只是普通的Java,不依赖于Vaadin。

票数 3
EN

Stack Overflow用户

发布于 2013-08-22 08:54:17

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

https://github.com/peholmst/MVP4Vaadin

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

票数 0
EN

Stack Overflow用户

发布于 2014-12-12 18:20:05

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

或者你可以使用ObjectProperty。

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

代码语言:javascript
复制
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*/}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18364610

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档