Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
GWT中的自定义插件事件_Gwt_Plugins_Jsni_Custom Event - Fatal编程技术网

GWT中的自定义插件事件

GWT中的自定义插件事件,gwt,plugins,jsni,custom-event,Gwt,Plugins,Jsni,Custom Event,我们已经编写了一个浏览器插件。它触发自定义事件,如“mycustomevent”。我需要将这些自定义事件合并到GWT中(即为其分配侦听器)。这是我在GWT中的插件类 class PluginObject extends Composite implements HasMyCustomEventHandler{ private Element plugin; private HTML html; private HandlerManager handlerManager;

我们已经编写了一个浏览器插件。它触发自定义事件,如“mycustomevent”。我需要将这些自定义事件合并到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();
    }
}
我需要能够为插件触发的事件分配处理程序。我希望能够在我的演示者中执行以下操作,但到目前为止,我还无法将其连接起来

@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类,一个MyCustomEventHandler接口,它扩展了定义的EventHandler,还有一个HasMyCustomEventHandler接口,它扩展了定义的HashHandler,但是在把它们全部连接起来之后,我什么也得不到。为了简洁起见,我省略了它们,我很乐意补充一些可能有用的东西

我可以在裸js中添加事件侦听器

obj.addEventListener("mycustomevent", function(){ foo(); }, false);
并每次捕获事件(调用foo()),因此我确信事件正在被触发

我曾尝试将以下内容添加到我的PluginObject类中,但这只是我在搜索时发现的猜测。它没有起作用

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

这里的正确方法是什么

以下是我在PluginObject中完成的工作。我很想听听改进的方法。我挂断了subscribeToBrowserEvents()和对“this”的引用。最初我调用addEvent方法并引用

this.@....
在运行时引用了错误的位置。更多关于这个问题的信息,请参阅。享受

类PluginObject扩展复合实现HasMyCustomEventHandler{
公共插件对象(){
handlerManager=新的handlerManager(本);
html=新html(“”)
+""
+"");
initWidget(html);
plugin=html.getElement().getFirstChildElement();
}
public void bindBrowserEvents(){
subscribeToBrowserEvents(插件);
}
public void eventHandlerMethod(字符串消息){
MyCustomEvent事件=新的MyCustomEvent(消息);
火灾事件(事件);
}
@凌驾
公共无效火灾事件(GwtEvent事件){
handlerManager.fireEvent(事件);
}
公共本机void subscribeToBrowserEvents(元素eventObject)/*-{
var pluginReference=此;
//约束听众
函数addEvent(对象、名称、函数)
{
if(window.addEventListener){
对象addEventListener(名称、函数、假);
}否则{
对象附件(“on”+名称,func);
}
}
addEvent(eventObject.br,'mycustomevent',
功能(信息){
pluginReference@com.Name.SomeTest2.client.core.PluginObject::eventHandlerMethod(Ljava/lang/String;)(消息);
});
}-*/;
@凌驾
受保护的空位{
super.onAttach();
//在onAttach中绑定,它之前不工作。我假设插件需要存在,绑定才能工作
bindBrowserEvents();
}
@凌驾
公共句柄注册addMyCustomEventHandler(MyCustomEventHandler)
{ 
返回handlerManager.addHandler(MyCustomEvent.TYPE,handler);
}
}
this.@....
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){
            pluginReference.@com.Name.SomeTest2.client.core.PluginObject::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);
}
}