5

我试图在我的 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);
 }
}-*/;

尽管火灾很好,但它会java.lang.ClassCastException在 FireBug 控制台中抛出一个。alert建议?

4

2 回答 2

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)
});
于 2011-03-08T16:50:32.737 回答
7
private native void publish(EntryPoint p) /*-{
 $wnd.setText = function(from) {
  alert(from);
  p.@com.example.my.Class::helloMethod(Ljava/lang/String;)(from);
 }
}-*/;

你能试试这个代码吗?

于 2011-03-08T17:00:12.303 回答