2012-03-07 43 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

相關問題