java - 如何使用 JavaScript 覆盖类型 (GWT) 包装回调?

标签 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?如果可以,请提供示例。 :)

最佳答案

事前编辑:我写了这个答案,并没有真正尝试去了解为什么你试图做这件事,假设你正在使用一些非浏览器事件,这已经是很好地结束了,如果你想从 NativeEvent 中获得更多数据例如,您可以在自己的类中编写 JSNI 方法来访问它,或者进一步子类化 NativeEvent添加更多方法和.cast()到你的类(class)。使用 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 中,不能具体指代方法(没有反射),而只能指代对象实例。构建简单回调的最简单方法是实现一个接口(interface),接受回调的代码接受接口(interface)的一个实例,并调用定义的方法。

GWT 声明一个 Command零参数函数的接​​口,以及一个通用的 Callback<T,F>可能通过或失败的情况的接口(interface),每个选项都有一个通用参数。 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 的错误处理和调度正常工作,重要的是将调用包装回 $entry 中的 java - 最后一行确实应该是

    doSomething($entry(callbackFunc));

关于java - 如何使用 JavaScript 覆盖类型 (GWT) 包装回调?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9606665/

相关文章:

gwt - 在哪里可以找到 Singular(AngularJS for GWT)的源代码?

Javascript amcharts 堆积条形图单击处理程序

c# - 通过 Razor 在 Javascript 代码中使用 C# 类中的变量

java - GXT 3.0 网格小部件搜索

java - 学习排序需要一些帮助吗?

javascript - 如何以map firestore web的形式将集合中具有值的所有文档推送到另一个集合

gwt - GWT grails插件错误resource.ResourceMeta-找不到资源:%nocache.js

java - 多线程正确性——同步不一致

java - Cassandra LWT 能否在 PRIMARY KEY 方面具有 IF 部分

java - Spring Bean Autowiring 错误