11

GWT Javaクラスの1つにネイティブJavascriptメソッドがありますが、ネイティブJavascriptコードからJavaメソッドを呼び出すのに問題があります。私はこれを可能な限り忠実に追跡しようとしましたが、機能させることができません。コンパイルしてFirefoxで実行したところ、エラーコンソールに「エラー:this.lcは関数ではありません」と表示されました。すべてのメソッドをpublicに変更してみましたが、違いは見られませんでした。私は何が間違っているのですか?

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 {
                this.@com.proprintsgear.design_lab.client.ValueBox::increaseValue()();
            }
            this.@com.proprintsgear.design_lab.client.ValueBox::fireChange()();
        }
    }

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

2 に答える 2

12

過去に行ったすべてのコードで、「this」を使用してクラスを識別したことはなく、クラスを渡しました。

例: これを変更します。

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 {
                        this.@com.proprintsgear.design_lab.client.ValueBox::increaseValue()();
                }
                this.@com.proprintsgear.design_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 {
                        instance.@com.proprintsgear.design_lab.client.ValueBox::increaseValue()();
                }
                instance.@com.proprintsgear.design_lab.client.ValueBox::fireChange()();
        }
    }

    var box=$doc.getElementById(id);
    box.addEventListener("mouseout",mouseOutHandler,false);
    box.addEventListener("mouseover",mouseOverHandler,false);
}-*/;
于 2009-06-12T01:04:08.880 に答える
4

私はより良い方法を見つけました。これは、「var that = this」を設定する JavaScript で行うことと似ています。このアプローチを使用すると、これを listenForPostMessage() に渡す必要はありません。

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

private final native void listenForPostMessage() /*-{
  var that = this;
  $wnd.addEventListener("message", function(msg) {
  that.@org.dartlang.gwtapplication.client.GwtApplication::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);
}
于 2013-02-05T00:17:16.717 に答える