2009-06-11 33 views
10

我在我的一個GWT Java類中有一個本地Javascript方法,但是我無法從本機Javascript代碼中調用我的Java方法。我試圖儘可能嚴密地遵循this,但我無法實現它的工作。我編譯它並在Firefox中運行它,並且錯誤控制檯說「錯誤:this.lc不是函數」。我嘗試將所有方法更改爲public,但這似乎沒有什麼區別。我究竟做錯了什麼?GWT中的本地Javascript方法

package com.proprintsgear.design_lab.client; 
... 
public class ValueBox extends HorizontalPanel { 
... 
private void fireChange() { 
    ... 
} 

private void increaseValue() { 
    ... 
} 

private native void addNativeMouseWheelListener(String id) /*-{ 
    function mouseOverHandler(e) { 
     $wnd.addEventListener("DOMMouseScroll", scrollWheelMove, false); 
    } 

    function mouseOutHandler(e) { 
     $wnd.removeEventListener("DOMMouseScroll", scrollWheelMove, false); 
    } 

    function scrollWheelMove(e) { 
     if ($wnd.event || $wnd.Event) { 
      if (!e) e = $wnd.event; 
      if (e.wheelDelta <= 0 || e.detail > 0) { 
       $wnd.alert("DOWN"); 
      } else { 
       [email protected]_lab.client.ValueBox::increaseValue()(); 
      } 
      [email protected]_lab.client.ValueBox::fireChange()(); 
     } 
    } 

    var box=$doc.getElementById(id); 
    box.addEventListener("mouseout",mouseOutHandler,false); 
    box.addEventListener("mouseover",mouseOverHandler,false); 
}-*/; 

回答

11

在所有我在過去所做的代碼,我從來沒有使用「這個」,以確定我的課,我在傳遞的類

如:更改此:

private native void addNativeMouseWheelListener(String id) /*-{ 
    function mouseOverHandler(e) { 
     $wnd.addEventListener("DOMMouseScroll", scrollWheelMove, false); 
    } 

    function mouseOutHandler(e) { 
     $wnd.removeEventListener("DOMMouseScroll", scrollWheelMove, false); 
    } 

    function scrollWheelMove(e) { 
     if ($wnd.event || $wnd.Event) { 
       if (!e) e = $wnd.event; 
       if (e.wheelDelta <= 0 || e.detail > 0) { 
         $wnd.alert("DOWN"); 
       } else { 
         [email protected]_lab.client.ValueBox::increaseValue()(); 
       } 
       [email protected]_lab.client.ValueBox::fireChange()(); 
     } 
    } 

    var box=$doc.getElementById(id); 
    box.addEventListener("mouseout",mouseOutHandler,false); 
    box.addEventListener("mouseover",mouseOverHandler,false); 
}-*/; 

要這樣:

private native void addNativeMouseWheelListener(ValueBox instance, String id) /*-{ 
    function mouseOverHandler(e) { 
     $wnd.addEventListener("DOMMouseScroll", scrollWheelMove, false); 
    } 

    function mouseOutHandler(e) { 
     $wnd.removeEventListener("DOMMouseScroll", scrollWheelMove, false); 
    } 

    function scrollWheelMove(e) { 
     if ($wnd.event || $wnd.Event) { 
       if (!e) e = $wnd.event; 
       if (e.wheelDelta <= 0 || e.detail > 0) { 
         $wnd.alert("DOWN"); 
       } else { 
         [email protected]_lab.client.ValueBox::increaseValue()(); 
       } 
       [email protected]_lab.client.ValueBox::fireChange()(); 
     } 
    } 

    var box=$doc.getElementById(id); 
    box.addEventListener("mouseout",mouseOutHandler,false); 
    box.addEventListener("mouseover",mouseOverHandler,false); 
}-*/; 
+2

完美!這是有道理的,但我希望在GWT網站上更好地記錄它。 – DLH 2009-06-12 12:46:23

4

我發現了一個更好的辦法。這與您在JavaScript中執行的操作類似,您可以在其中設置「var that = this」。使用這種方法,您不必將此傳遞給listenForPostMessage():

protected native void postMessage(String msg) /*-{ 
    $wnd.postMessage(msg, "*"); 
}-*/; 

private final native void listenForPostMessage() /*-{ 
    var that = this; 
    $wnd.addEventListener("message", function(msg) { 
    [email protected]::onPostMessage(Ljava/lang/String;Ljava/lang/String;)(
    msg.data, msg.origin); 
    }); 
}-*/; 

private void onPostMessage(String data, String origin) { 
    Label msgLabel = new Label(); 
    msgLabel.setText("GWT received a postMessage: Data: " + 
     data + " Origin: " + origin); 
    mainPanel.add(msgLabel); 
}