2012-03-07 62 views
6

Display Object类中,除了事件之外,我已经包装了所有东西。我无法弄清楚这种模式,真的需要一个例子。如何使用JavaScript Overlay类型(GWT)包装回调?

在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

我 - 让GWT的错误处理和调度工作正常,包装回调到Java在$入口是非常重要的不太确定你为什么使用JavaScript覆盖。你有没有尝试GwtEvent 和一个HandlerManager为你的点击事件?如果需要,我可以解释他们。 – 2012-03-08 04:11:44

+0

EaselJS是一个用于与画布进行交互的库。回调由EaselJS引擎在按下画布的特定部分时调用。不幸的是,我不能使用GwtEvent,因为DisplayObject不是页面元素。 – LoneWolf 2012-03-08 08:43:31

+0

我明白了,我必须自己检查一下 – 2012-03-08 14:58:28

回答

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中,一个不能专指一种方法(没有反射),而只能针对对象实例。构建简单回调的最简单方法是实现一个接口,接收回调的代码接收接口的一个实例并调用已定义的方法。

GWT声明了零参数函数的接​​口Command,以及可能通过或失败的通用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 
     [email protected]::onSuccess(Ljava/lang/String;)("success!"); 
    }; 
    doSomethingWith(callbackFunc);//something that takes (and presumably calls) the callback 
}-*/; 

最后一条 - 最后一行确实应该

doSomething($entry(callbackFunc)); 
+0

谢谢你提供的信息非常丰富。我很高兴地通知我已成功附加了点击事件!非常感谢 – LoneWolf 2012-03-08 10:45:14

+0

eclipse抱怨onSuccess(Ljava/lang/String;)(“success!”);但我认为可以使用onSuccess(Ljava/lang/Object;)(“success!”);而不是 – 2015-07-22 10:37:55

+1

谢谢@LorenzoSciuto,你是对的,我应该忽略这个泛型并且去了Object。另一个选择是使用'*',意思是“只有一个方法带有这个名字,所以你实际上不需要参数类型来找出它”。 – 2015-07-22 13:35:44