2

外部javascriptは、という名前のJavaメソッドに渡す必要のある番号を提供しますmycallback

私は定義しました:

Java:

class MyClass {
    public static void mycallback(JavaScriptObject number) {
        // do something with the number
    }
}

Javascript:

$wnd.callback = $entry(@com.package.MyClass::mycallback(Lcom/google/gwt/core/client/JavaScriptObject));

そして、Javascriptの呼び出しは次のとおりです。

$wnd.callback(number_from_external_javascript);

しかし、エラーが発生します:

JS value of type number, expected com.google.gwt.core.client.JavaScriptObject

そして、私の最終的な目標はInteger、JavascriptObjectではなく、パラメータタイプがのjavaメソッドを持つことです。GWTはjavascriptオブジェクトをJavascriptObjectでラップする必要があると思っていましたが、そうではないようです。

GWTのバージョンは2.4です。

4

2 に答える 2

7

GWT は、JS Number 値を任意の Java 数値プリミティブ型 ( 、など) に、JS String を Java String に、JS Boolean を Javaに自動的にキャストします。それらをsとして渡すことは決してありません。intdoublebooleanJavaScriptObject

数値を null にできない場合は、int引数を使用してコールバックを宣言するだけです。null になる可能性があるInteger場合は、次のようにインスタンス を明示的に作成する必要があります。

$wnd.callback = $entry(function(n) {
      if (number != null) {
         // box into java.lang.Integer
         number = @java.lang.Integer::valueOf(I)(n);
      }
      @com.packge.MyClass::mycallback(Ljava/lang/Integer;)(number);
   });

JavaScriptObjectまたは、JS 番号をNumber 値ではなく Number オブジェクトとして渡すことができると思うので、これはうまくいくかもしれません:

$wnd.callback = $entry(function(n) {
      n = new Number(n); // "box" as a Number object
      @com.packge.MyClass::mycallback(Lcom/google/gwt/core/client/JavaScriptObject;)(n);
   });
于 2012-10-02T08:48:55.660 に答える
2

gwt-exporterジェネレーターを使用して gwt コードを js に公開すると、jsni を扱う必要がなくなり、jsni が持つ優れた機能 (複雑なオブジェクト、配列、クロージャー、オーバーレイ、ドックレットなど) を利用できます。

gwt-exporter を使用すると、クラスは Exportable を実装し、アノテーションを使用してメソッドを公開するだけで済みます。

public static class MyClass implements Exportable {
 @Export("$wnd.mycallback")
 public static void mycallback(long number) {
  Window.alert("" + number);
 }
}

この行を onmoduleload に追加し、コンパイラに作業を任せます

public void onModuleLoad() {
  ExporterUtil.exportAll();
}

次に、あなたが言ったようにメソッドを使用できます

<script>
  window.mycallback(1234)
</script>
于 2012-10-02T11:04:22.787 に答える