2009-06-11 12 views
10

GWT Javaクラスの1つにネイティブJavascriptメソッドがありますが、JavaメソッドをネイティブJavascriptコードから呼び出す際に問題があります。私はthisにできるだけ近づけようとしましたが、動作させることができません。私はそれをコンパイルし、Firefoxで実行し、エラーコンソールは"エラー:this.lcは関数ではありません"と言っています。私はすべての方法を公衆に変更しようとしましたが、それは違いはありませんでした。私は間違って何をしていますか?私が過去に行ったすべてのコードで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

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); 
} 
関連する問題