воскресенье, 22 июля 2012 г.

Programmatically fire events in GWT

     Иногда необходимо программно сгенерировать событие на определенном элементе, например на ссылке, метке или кнопке. Вызовем событие клика на ссылке(firstAnchor) из другой ссылки(secondAnchor). Рассмотрим возможные способы как это сделать.
1-ый способ:
  1. firstAnchor.addClickHandler(new ClickHandler() {
  2.     @Override
  3.     public void onClick(ClickEvent event) {
  4.         secondAnchor.fireEvent(new GwtEvent<ClickHandler>(){
  5.             @Override
  6.             public GwtEvent.Type<ClickHandler> getAssociatedType() {
  7.                 return ClickEvent.getType();
  8.             }
  9.             @Override
  10.             protected void dispatch(ClickHandler handler) {
  11.                 handler.onClick(null);
  12.             }
  13.         });
  14.     }
  15. });
* This source code was highlighted with Source Code Highlighter.
2-ой способ:
  1. NativeEvent nativeClickEvent =
  2.     Document.get().createClickEvent(0, 0, 0, 0, 0, false, false, false, false);
  3. DomEvent.fireNativeEvent(nativeClickEvent, secondAnchor);
  4. // or we can create ENTER keydown event
  5. NativeEvent nativeKeyDownEvent =
  6.     Document.get().createKeyDownEvent(false, false, false, false, KeyCodes.KEY_ENTER);
  7. DomEvent.fireNativeEvent(nativeKeyDownEvent, secondAnchor);
* This source code was highlighted with Source Code Highlighter.
3) следующий способ работает, но это небольшой хак :) потому что com.google.gwt.event.dom.client.ClickEvent имеет protected конструктор.
  1. // it works but, it's a little bit hack
  2. secondAnchor.fireEvent(new ClickEvent(){});
* This source code was highlighted with Source Code Highlighter.
4) так как все браузеры реализуют метод click() на элементе, который генерирует событие нажатия на элементе, то можно воспользоваться вызовом через JSNI
  1. click(secondAnchor.getElement());
  2. ...
  3. public static native void click(Element elem) /*-{
  4.     elem.click();
  5. }-*/;
* This source code was highlighted with Source Code Highlighter.
5) или можно скастовать элемент Element в ButtonElement или InputElement и вызвать метод click()
secondAnchor.getElement().<ButtonElement>cast().click();

* This source code was highlighted with Source Code Highlighter.

1 комментарий: