GWT JSNI - 传递字符串的问题

时间:2011-03-08 15:44:26

标签: gwt jsni

我正在尝试在我的GWT项目中提供一些函数挂钩:

private TextBox hello = new TextBox();
private void helloMethod(String from) { hello.setText(from); }
private native void publish() /*-{
 $wnd.setText = $entry(this.@com.example.my.Class::helloMethod(Ljava/lang/String;));
}-*/;
publish()中调用

onModuleLoad()。但这不起作用,在开发控制台中没有提供反馈的原因。我也试过了:

private native void publish() /*-{
 $wnd.setText = function(from) {
  alert(from);
  this.@com.example.my.Class::helloMethod(Ljava/lang/String;)(from);
 }
}-*/;

会在FireBug控制台中抛出java.lang.ClassCastException,尽管alert会很好。建议?

2 个答案:

答案 0 :(得分:7)

helloMethod是一种实例方法,因此当调用时,它需要设置this引用。您的第一个示例不会在通话时执行此操作。你的第二个例子尝试这样做,但是有一点错误,可以在JavaScript中轻松搞定:

中的this引用
$wnd.setText = function(from) {
  this.@com.example.my.Class::helloMethod(Ljava/lang/String;)(from);
};

指向函数本身。为避免这种情况,您必须执行以下操作:

var that = this;
$wnd.setText = function(from) {
  that.@com.example.my.Class::helloMethod(Ljava/lang/String;)(from);
};

或更好:

var that = this;
$wnd.setText = $entry(function(from) {
  that.@com.example.my.Class::helloMethod(Ljava/lang/String;)(from)
});

答案 1 :(得分:7)

private native void publish(EntryPoint p) /*-{
 $wnd.setText = function(from) {
  alert(from);
  p.@com.example.my.Class::helloMethod(Ljava/lang/String;)(from);
 }
}-*/;

你能尝试一下这段代码吗?