如何使用JavaScript Overlay类型(GWT)包装回调?

时间:2012-03-07 17:56:20

标签: java javascript gwt overlay jsni

Display Object课程中,除了事件外,我所有内容都被包裹起来。我无法弄清楚模式,真的需要一个例子。

在JavaScript中,您可以为对象创建一个回调函数:

displayObject.onPress = function(event) {
    $wnd.alert("object pressed");
}

我已经包装了Mouse Event参数:

public class MouseEventImpl extends JavaScriptObject {
    protected MouseEventImpl() {}

    public static native MouseEventImpl create(String type, int stageX, int stageY, DisplayObjectImpl target, JavaScriptObject nativeEvent) /*-{
        return new $wnd.MouseEvent(type, stageX, stageY, target, nativeEvent);
    }-*/;

    ...other methods excluded...
}

public class MouseEvent {
    private MouseEventImpl impl;

    public MouseEvent(String type, int stageX, int stageY, DisplayObject target, JavaScriptObject nativeEvent) {
        this.impl = MouseEventImpl.create(type, stageX, stageY, target.getOverlay(), nativeEvent);
    }

    ...other methods excluded...
}

显示对象使用相同的叠加图案。我怎么能在java中编写回调并将其传递给JSO?如果可以的话请提供一个例子。 :)

1 个答案:

答案 0 :(得分:7)

帖子前编辑:我写了这个答案而没有真正试图看到为什么你试图做这件事,假设你正在使用一些非浏览器事件,这已经是很好地包装了,如果你想要更多来自NativeEvent实例的数据,你可以在自己的类中编写JSNI方法来访问它,或者进一步创建子类NativeEvent以添加更多方法和{{ 1}}到你的班级。使用.cast()方法和相应的Widget.addDomHandler子类将处理程序添加到窗口小部件以获取类型实例。


在JavaScript中,回调只是在发生事件时调用的函数。除非特别指定传入它们的位置,否则通常会在全局上下文中调用它们,而不是在特定对象实例上调用它们。

MouseEvent

要在实例上调用函数(即使其成为方法调用),可以将该调用包装在不需要实例的函数中:

var callback = function() { alert("callback called!"); };

// later, in something that consumes that callback:
callback();

在Java中,不能专门引用方法(没有反射),而只能引用对象实例。构建简单回调的最简单方法是实现一个接口,接受回调的代码接受一个接口实例,并调用定义的方法。

GWT为零arg函数声明一个var obj = {}; obj.name = "Me"; obj.whenSomethingHappens = function() { alert("my name is " + this.name); }; // wont work, so commented out: //var callback = obj.whenSomethingHappens; // instead we wrap in a function // this is making a closure (by closing over obj) var callback = function() { obj.whenSomethingHappens(); }; // later, in something that consumes that callback: callback(); 接口,为可能通过或失败的情况声明一个通用Command接口,每个选项都有一个通用arg。 GWT中的大多数事件处理程序只定义了一种方法,并将特定数据传递给该方法。

我们需要使用所有这些知识将Java实例(带有调用函数)传递给JavaScript,并确保在正确的实例上调用它们。这个例子是一个函数,它接受一个Callback<T,F>实例,并使用JSNI包装对它的调用JS。

Callback

最后一篇 - 让GWT的错误处理和调度工作正常,将调用包装回$ entry中的java是很重要的 - 最后一行应该是

// a callback that has a string for either success or failure
public native void addCallback(Callback<String, String> callback) /*-{
    var callbackFunc = function() {
        // obviously the params could come from the function params
        callback.@com.google.gwt.core.client.Callback::onSuccess(Ljava/lang/String;)("success!");
    };
    doSomethingWith(callbackFunc);//something that takes (and presumably calls) the callback
}-*/;