3

我有这样的代码:

TextBox txt = new TextBox(){
  public void onLoad(){
    this.addFocusHandler(new FocusHandler(){
      //some codes here
      //if I use "this" keyword, it refers to the handler, but how can I get a reference to the textbox?
    });
  }
};

问题嵌入位置。


编辑:

关于答案,创建预定义参考适用于这种情况,但这显然失去(或至少减少)匿名对象/函数的好处。

我希望在不创建新参考的情况下找到一种方法。而只是从该范围获取参考。


在所有答案之后,这是一个结论:

  • 反射在 GWT 中不起作用。(至少我没有成功)obj.getClass()工作,但其他人喜欢getMethods()getEnclosingClass()不工作。
  • 获取引用的方法可以是在正确的范围内声明引用,也可以是获取更高级别的对象引用并向下引用。我更喜欢后者只是因为您不需要创建新变量。
4

5 回答 5

3
TextBox txt = new TextBox(){
    public void onLoad(){
        final TextBox finalThis = this;
        this.addFocusHandler(new FocusHandler(){
             finalThis.doSomething();
        );
    }
};
于 2012-09-20T16:31:10.330 回答
2

Java 中非静态内部类(匿名或命名)的封闭实例可用作ClassName .this,即

TextBox txt = new TextBox(){
  public void onLoad(){
    this.addFocusHandler(new FocusHandler(){
      doSomethingCleverWith(TextBox.this);
    });
  }
};
于 2012-09-20T16:30:35.417 回答
1

这在过去对我有用。它也适用于客户端js。这里是更详细的参考 Java中Class.this和this有什么区别

public class FOO {

    TextBox txt = new TextBox(){
          public void onLoad(){
            this.addFocusHandler(new FocusHandler(){

                @Override
                public void onFocus(FocusEvent event) {
                    FOO.this.txt.setHeight("100px");
                }
            });
          }
        };


}
于 2012-09-25T22:32:23.453 回答
0

这可能对您有用:

TextBox txt = new TextBox(){
    public void onLoad(){
        final TextBox ref = this;
        this.addFocusHandler(new FocusHandler(){

            public void doSomething(){ 
                //some codes
                ref.execute();
            }
        });
    }
};

但我更喜欢将内部类迁移到命名类:

public class Test {

    public void demo(){
        TextBox txt = new TextBox(){
            public void onLoad(){
                this.addFocusHandler(new DemoFocusHandler(this));
            }
        };
    }
}

外部焦点处理程序:

public class DemoFocusHandler extends FocusHandler {

    private TextBox textBox;

    public DemoFocusHandler(TextBox textBox){
        this.textBox = textBox;
    }

    public void doSomething(){ 
        //some codes
        textBox.execute();
    }
}
于 2012-09-20T16:04:04.243 回答
0

如果 gwt 支持反射,您可以按照以下方式做一些事情:

final TextBox txt = new TextBox() {
   public void onLoad() {

      final Object finalThis  = this;

      this.addFocusHandler(new FocusHandler() {

         @Override
         public void onFocus(FocusEvent event) {
           try {
            Method method= finalThis.getClass().getMethod("getVisibleLength");
            method.invoke(finalThis);
           } catch (Exception e) {
            e.printStackTrace();
           } 
        }
    });
  }
};

没有反思,现有的答案是你最好的选择。有两个 gwt 反射项目gwt 反射gwt-preprocessor都处于测试阶段,我还没有尝试过。

于 2012-09-28T07:18:37.887 回答