2011-10-23 4 views
0

브라우저 플러그인을 코딩했습니다. 'mycustomevent'와 같은 맞춤 이벤트를 실행합니다. 이러한 맞춤 이벤트를 GWT에 통합해야합니다 (예 : 청취자를 할당). 다음은 GWT의 플러그인 클래스입니다.GWT의 맞춤 플러그인 이벤트

class PluginObject extends Composite implements HasMyCustomEventHandler{ 
    private Element plugin; 
    private HTML html; 
    private HandlerManager handlerManager; 

    public PluginObject(){ 
     handlerManager = new HandlerManager(this); 
     html = new HTML("<object id='plugin0' type='application/x-ourplugin' width='300' height='300'>" 
         +"<param name='onload' value='pluginLoaded' />" 
         +"</object>"); 
     initWidget(html); 
     plugin = html.getElement().getFirstChildElement(); 
    } 
} 

다음은 내가보기에 추가하는 방법입니다 (gwtp를 사용하고 있습니다). 그것은 추가되고 있으며 페이지에서 올바르게 작동하고 있으며 js 함수를 gnt에서 JSNI로 호출 할 수 있습니다.

@Inject 
public MyPageView(){ 

    ... 
    plugin = new PluginObject(); 
    panel.add(plugin); 
} 

플러그인에서 시작된 이벤트에 대한 처리기를 할당 할 수 있어야합니다. 제 발표자에게 다음과 같은 일을 할 수 있기를 원하지만 지금까지는 유선화 할 수 없었습니다.

@Override 
protected void onBind(){ 
    super.onBind(); 
    registerHandler(getView().getPluginObject().addMyCustomEventHandler(
     new MyCustomEventHandler() { 
      @Override 
      public void onMyCustomEvent(MyCustomEvent event) { 
       // call some other presenter stuff here... 
      } 
     })); 
} 

위의 내용은 몇 가지 추가 클래스에 대해 설명합니다. MyCustomEvent 클래스가 정의되어 있고 정의 된 EventHandler를 확장하는 MyCustomEventHandler 인터페이스와 HasHandlers를 정의한 HasMyCustomEventHandler 인터페이스가 있지만 모두 연결 한 후에는 아무 것도 얻을 수 없습니다. 나는 간결함을 위해 그것들을 생략했습니다. 나는 도움이 될만한 것을 추가하게되어 기쁩니다.

맨위로 이벤트 리스너를 추가 할 수 있습니다. (호출되는 foo는())

obj.addEventListener("mycustomevent", function(){ foo(); }, false); 

이벤트를 잡을 때마다 그래서 이벤트가 해고되고 확신한다.

내 PluginObject 클래스에 다음을 추가하려고 시도했지만, 이것은 내가 검색 한 것으로 추측 한 것입니다. 그것은 효과가 없습니다.

public HandlerRegistration addMyCustomEventHandler(MyCustomEventhandler handler){ 
    return handlerManager.addHandler(MyCustomEvent.TYPE, handler); 
} 

올바른 접근 방법은 무엇입니까?

답변

0

다음은 PluginObject에서 수행 한 작업입니다. 나는 그것을 향상시키는 방법을 듣고 싶다. subscribeToBrowserEvents() 및 'this'에 대한 참조에서 잠시 멈추었습니다. 처음에 addEvent 메소드를 호출하고 참조했습니다.

[email protected] 

런타임에 잘못된 장소를 참조하는 항목입니다. 이 문제에 대한 자세한 내용은 this bit of the JSNI docs입니다. 즐겨.

class PluginObject extends Composite implements HasMyCustomEventHandler{ 

public PluginObject(){ 
    handlerManager = new HandlerManager(this); 

    html = new HTML("<object id='plugin0' type='application/x-myplugin' width='300' height='300'>" 
         +"<param name='onload' value='pluginLoaded' />" 
         +"</object>"); 
    initWidget(html); 
    plugin = html.getElement().getFirstChildElement();  
} 

public void bindBrowserEvents(){ 
    subscribeToBrowserEvents(plugin); 
} 

public void eventHandlerMethod(String message){ 
    MyCustomEvent event = new MyCustomEvent(message);  
    fireEvent(event); 
} 
@Override 
public void fireEvent(GwtEvent<?> event){ 
    handlerManager.fireEvent(event); 
} 

public native void subscribeToBrowserEvents(Element eventObject) /*-{ 

    var pluginReference = this; 

    // bind the listener 
    function addEvent(obj, name, func) 
    { 
     if (window.addEventListener) { 
      obj.addEventListener(name, func, false); 
     } else { 
      obj.attachEvent("on"+name, func); 
     } 
    } 

    addEvent(eventObject.br,'mycustomevent', 
     function(message){ 
      [email protected]::eventHandlerMethod(Ljava/lang/String;)(message); 
     }); 
}-*/; 

@Override 
protected void onAttach(){ 
    super.onAttach(); 
    // bind in the onAttach, it was not working earlier. I assume the plugin needs to exist before the bindings will work 
    bindBrowserEvents(); 
} 

@Override 
public HandlerRegistration addMyCustomEventHandler(MyCustomEventHandler handler) 
{ 
    return handlerManager.addHandler(MyCustomEvent.TYPE, handler); 
} 
}