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));
            }
        };
    }
}

外部FocusHandler:

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();
           } 
        }
    });
  }
};

反省することなく、既存の答えが最善の策です。2つのgwtリフレクションプロジェクトがあります。gwtリフレクションgwtプリプロセッサはどちらもベータ版であり、私はそれらを試していません。

于 2012-09-28T07:18:37.887 に答える