6

Display Object类中,除了事件之外,我已经包装了所有内容。我无法弄清楚模式,真的需要一个例子。

在 JavaScript 中,您可以像这样为对象创建回调:

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

我已经包装了鼠标事件参数:

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?如果可以,请提供一个例子。:)

4

1 回答 1

7

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


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

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

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

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

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();

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

GWTCommand为零参数函数声明了一个接口,Callback<T,F>为可能通过或失败的情况声明了一个通用接口,每个选项都有一个通用参数。GWT 中的大多数事件处理程序只定义一种方法,并将特定数据传递给该方法。

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

// 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
}-*/;

最后一件——为了让 GWT 的错误处理和调度正常工作,重要的是把对 java 的调用包装在 $entry 中——最后一行应该是

    doSomething($entry(callbackFunc));
于 2012-03-08T04:54:59.287 回答