在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?如果可以的话请提供一个例子。 :)
答案 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
}-*/;