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

标签 java events vaadin observer-pattern vaadin7

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

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

这可以用 Vaadin 7 完成吗?

基本上我想解耦我的 View 并提供组件之间的简单通信。我也在使用 Spring 和 Vaadin。如果您对观察者模式有更好的想法,我也将不胜感激。

谢谢

最佳答案

你需要什么:
1. 触发事件的组件
2.自定义事件类
3. 监听接口(interface)
4. 和监听器实现

1 中的组件需要有一个事件监听器列表,方法:addListener移除监听器;和 dispatchEventdispatchEvent 方法将遍历事件监听器列表并执行某些方法(参见 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/

相关文章:

java - java中当语句为真时if循环代码不执行

java - 获取一个看起来像 XML 的 String 元素并在 java 中对其进行操作

Excel vba - 禁用鼠标事件

c# - 如何测试事件是否包含事件处理程序?

java - vaadin 14 中复制到剪贴板组件

Vaadin TreeGrid 没有展开或折叠图标

java - 如何跳过已访问(重复)值的索引?

java - 如何通过单次声明获取当前用户信息?

.net - 添加对 GAC 的 DLL 的 Web 引用

java - 瓦丁 : Widget set is not getting loaded.