2

外部 javascript 提供了一个数字,该数字应交给名为mycallback.

我已经定义:

爪哇:

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 数字原始类型(int,double等),将 JS String 转换为 Java String ,并将 JS Boolean 转换为 Java boolean。它永远不会将它们作为JavaScriptObjects 传递。

如果数字不能为空,则只需使用int参数声明您的回调。如果它可以为空,那么您必须显式创建一个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或者,我认为如果它是 Number 对象而不是 Number 值,我认为您可以将 JS 数字作为 a 传递,所以这可能有效:

$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 并且可以受益于它所具有的出色功能(复杂对象、数组、闭包、覆盖、doclet 等)

使用 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 回答