当前位置: 代码迷 >> Web前端 >> Event 事件系统(转的自个儿看)
  详细解决方案

Event 事件系统(转的自个儿看)

热度:173   发布时间:2012-10-09 10:21:45.0
Event 事件系统(转的自己看)

1.Event 事件系统

文章分类:Web前端 要说GXT里面的事件Event,就必须先了解一下GWT提供的事件系统

GWT中基础的事件类是:com.google.gwt.user.client.Event
在这里GWT给我们提供了浏览器原生的20种左右的事件,每一个事件都用一个Int整数类型表示
如:

Java代码
  1. /** ?
  2. ?*?Fired?when?the?user?clicks?on?an?element. ?
  3. ?*/ ??
  4. public ? static ? final ? int ?ONCLICK?=? 0x00001 ;??
  /**
   * Fired when the user clicks on an element.
   */
  public static final int ONCLICK = 0x00001;



GWT只提供了原生的事件,实际GXT中需要很多的自定义事件,GXT是如何扩展事件系统的呢?

GXT中创建了一个:com.extjs.gxt.ui.client.event.EventType 类,通过创建这个类的实例来表示一种事件(对比GWT中是用int整数来表示一种事件)。GWT中通过int类型来区别不同的事件,而GXT的 EventType则是通过比较内存地址来判断是否为不同的事件。

com.extjs.gxt.ui.client.event.Events 类列出了GXT提供的所有事件类型,截取片段代码如下:

Java代码
  1. /** ?
  2. ?*?Defines?the?GXT?event?types. ?
  3. ?*/ ??
  4. public ? class ?Events?{??
  5. ??
  6. ??/** ?
  7. ???*?Activate?event?type. ?
  8. ???*/ ??
  9. ??public ? static ? final ?EventType?Activate?=? new ?EventType();??
  10. ??
  11. ??/** ?
  12. ???*?Add?event?type. ?
  13. ???*/ ??
  14. ??public ? static ? final ?EventType?Add?=? new ?EventType();??
  15. ??
  16. ??/** ?
  17. ???*?Adopt?event?type. ?
  18. ???*/ ??
  19. ??public ? static ? final ?EventType?Adopt?=? new ?EventType();??
/**
 * Defines the GXT event types.
 */
public class Events {

  /**
   * Activate event type.
   */
  public static final EventType Activate = new EventType();

  /**
   * Add event type.
   */
  public static final EventType Add = new EventType();

  /**
   * Adopt event type.
   */
  public static final EventType Adopt = new EventType();


因为这些事件类型是带有逻辑的自定义的事件,数量上远远大于浏览器的原生事件。目前GXT2.1的事件就达到145种,未来应该还会添加!

这样说来GXT与GWT采用了2套事件系统,会不会有冲突呢?
比如GWT捕获到一个Event.ONCLICK的单击事件,通知给GXT,因为这是一个int数据,而GXT识别的是EventType类型的事件,GXT如何来识别GWT的事件并转化为自己能够认识的EventType事件呢?

解决方法是GXT将GWT提供的原生事件与GXT中的事件进行了绑定。参考代码:

Java代码
  1. private ? static ?Map<String,?EventType>?browserEvents?=? new ?FastMap<EventType>();??
  2. ??
  3. static ?{??
  4. ??browserEvents.put(String.valueOf(Event.ONBLUR),?OnBlur);??
  5. ??browserEvents.put(String.valueOf(Event.ONCHANGE),?OnChange);??
  6. ??browserEvents.put(String.valueOf(Event.ONCLICK),?OnClick);??
  7. ??browserEvents.put(String.valueOf(Event.ONCONTEXTMENU),?OnContextMenu);??
  8. ??browserEvents.put(String.valueOf(Event.ONDBLCLICK),?OnDoubleClick);??
  9. ??browserEvents.put(String.valueOf(Event.ONERROR),?OnError);??
  10. ??browserEvents.put(String.valueOf(Event.ONFOCUS),?OnFocus);??
  11. ??browserEvents.put(String.valueOf(Event.ONKEYDOWN),?OnKeyDown);??
  12. ??browserEvents.put(String.valueOf(Event.ONKEYPRESS),?OnKeyPress);??
  13. ??browserEvents.put(String.valueOf(Event.ONKEYUP),?OnKeyUp);??
  14. ??browserEvents.put(String.valueOf(Event.ONLOAD),?OnLoad);??
  15. ??browserEvents.put(String.valueOf(Event.ONLOSECAPTURE),?OnLoseCapture);??
  16. ??browserEvents.put(String.valueOf(Event.ONMOUSEDOWN),?OnMouseDown);??
  17. ??browserEvents.put(String.valueOf(Event.ONMOUSEUP),?OnMouseUp);??
  18. ??browserEvents.put(String.valueOf(Event.ONMOUSEOVER),?OnMouseOver);??
  19. ??browserEvents.put(String.valueOf(Event.ONMOUSEOUT),?OnMouseOut);??
  20. ??browserEvents.put(String.valueOf(Event.ONMOUSEMOVE),?OnMouseMove);??
  21. ??browserEvents.put(String.valueOf(Event.ONMOUSEWHEEL),?OnMouseWheel);??
  22. ??browserEvents.put(String.valueOf(Event.ONPASTE),?OnPaste);??
  23. ??browserEvents.put(String.valueOf(Event.ONSCROLL),?OnScroll);??
  24. ??
  25. }??
  private static Map<String, EventType> browserEvents = new FastMap<EventType>();

  static {
    browserEvents.put(String.valueOf(Event.ONBLUR), OnBlur);
    browserEvents.put(String.valueOf(Event.ONCHANGE), OnChange);
    browserEvents.put(String.valueOf(Event.ONCLICK), OnClick);
    browserEvents.put(String.valueOf(Event.ONCONTEXTMENU), OnContextMenu);
    browserEvents.put(String.valueOf(Event.ONDBLCLICK), OnDoubleClick);
    browserEvents.put(String.valueOf(Event.ONERROR), OnError);
    browserEvents.put(String.valueOf(Event.ONFOCUS), OnFocus);
    browserEvents.put(String.valueOf(Event.ONKEYDOWN), OnKeyDown);
    browserEvents.put(String.valueOf(Event.ONKEYPRESS), OnKeyPress);
    browserEvents.put(String.valueOf(Event.ONKEYUP), OnKeyUp);
    browserEvents.put(String.valueOf(Event.ONLOAD), OnLoad);
    browserEvents.put(String.valueOf(Event.ONLOSECAPTURE), OnLoseCapture);
    browserEvents.put(String.valueOf(Event.ONMOUSEDOWN), OnMouseDown);
    browserEvents.put(String.valueOf(Event.ONMOUSEUP), OnMouseUp);
    browserEvents.put(String.valueOf(Event.ONMOUSEOVER), OnMouseOver);
    browserEvents.put(String.valueOf(Event.ONMOUSEOUT), OnMouseOut);
    browserEvents.put(String.valueOf(Event.ONMOUSEMOVE), OnMouseMove);
    browserEvents.put(String.valueOf(Event.ONMOUSEWHEEL), OnMouseWheel);
    browserEvents.put(String.valueOf(Event.ONPASTE), OnPaste);
    browserEvents.put(String.valueOf(Event.ONSCROLL), OnScroll);

  }


browserEvents 这个map对象绑定了GWT事件与GXT的EventType事件
当GXT接收到GWT传递过来的一个int类型的事件时,GXT会调用:

Java代码
  1. public ? static ?EventType?lookupBrowserEvent( int ?browserEventType)?{??
  2. ??EventType?type?=?browserEvents.get(String.valueOf(browserEventType));??
  3. ??assert ?type?!=? null ;??
  4. ??return ?type;??
  5. }??
  public static EventType lookupBrowserEvent(int browserEventType) {
    EventType type = browserEvents.get(String.valueOf(browserEventType));
    assert type != null;
    return type;
  }


方法来查找对应的EventType事件,找到后以自己的一套事件系统来传递和处理这个事件

  相关解决方案