2011-08-20 11 views
2

私は、多くのボタン(Button1、Button2など)を含む複合ウィジェットを持っています。私は複合ウィジェットのボタンクリックイベントをどのように公開するのか理解できません。私は、Button1ClickEventやButton2ClickEventなどのカスタムイベントを作成しないで、両方のイベントに既存のGWT ClickEventを再利用しようとしています。私はこれがベストプラクティスではないと思う包含するコンポジットオブジェクトの子オブジェクトからイベントを公開するにはどうすればよいですか?

public class WidgetWithTwoButtons extends Composite { 
    ... 

    @UiField Button button1; 
    @UiField Button button2; 

    @UiHandler("button1") 
    void onButton1Click(ClickEvent event) { 
      // TODO fire click event on Button1ClickHandler 
    } 

    public HandlerRegistration addButton1ClickHandler(ClickHandler handler) { 
      return addDomHandler(handler, ClickEvent.getType()); 
    } 

    @UiHandler("button2") 
    void onButton1Click(ClickEvent event) { 
      // TODO fire click event on Button2ClickHandler 
    } 

    public HandlerRegistration addButton2ClickHandler(ClickHandler handler) { 
      return addDomHandler(handler, ClickEvent.getType()); 
    } 
} 

:次のコードスニペットは、私が何をしようとしているアイデアを与えることができます。あなたの答えの中で、この問題に対する推奨される解決法/例への指針を与えていただければ幸いです。ありがとう!

答えて

3

私はあなたの問題について考え始め、最初のあなたは単にあなたの現在のaddButton1ClickHandler(ClickHandler handler)を変更することができますaddDomHandlerを使用する代わりに気づいた:あなたが唯一のボタンを持っていた場合、あなたはあなたのコンポジットがHasClickHandlersを実装することによって、それを公開することができ

public HandlerRegistration addButton1ClickHandler(ClickHandler handler) { 
    return button1.addClickHandler(handler); 
} 

そして、あなたのボタンにそれを通過するには、以下の方法で実装します。

@Override 
public HandlerRegistration addClickHandler(ClickHandler handler) { 
    return button1.addClickHandler(handler); 
} 

をしかし、あなたは多くのボタンを持っているので、あなたはあなたはclickHandlerを追加したいボタンを取る方法を必要とします以下のようなパラメータとして:あなたがあなたの複合であなたのボタンのゲッターメソッドを定義する必要があることを意味し、あなたのボタンへの参照を持っている必要があり

public HandlerRegistration addClickHandlerToButton(ClickHandler handler, Button target){ 
    return target.addClickHandler(handler); 
} 

このアプローチの問題は、これを使用することなどpublic Button getButton1() 。このようなボタンを公開すると、パラメータボタンとしてターゲットボタンを使用する上記の方法をとにかく行うことができるため、ボタンに直接アクセスできるため、コンポジットにパススルーメソッドが不要になるという問題があります。最悪の部分は、彼/彼女はスタイルを変更することも、それらのボタンを切り離すことさえできます。

これを解決するには、ボタンをHasClickHandlersインターフェイスに公開します。このアプローチで

public class ComplexComposite extends Composite { 

    private Button button1 = new Button("btn1"); 
    private Button button2 = new Button("btn2"); 

    public ComplexComposite(){ 
     HorizontalPanel panel = new HorizontalPanel(); 
     panel.add(button1); 
     panel.add(button2); 
     initWidget(panel); 
    } 
    public HasClickHandlers getButton1(){ 
     return button1; 
    } 
    public HasClickHandlers getButton2(){ 
     return button2; 
    } 
} 

あなたが唯一の希望のインターフェースを介して、あなたのボタンを公開し、1のような クリックハンドラを追加することができます:

ComplexComposite composite = new ComplexComposite(); 
composite.getButton1().addClickHandler(new ClickHandler() { 
    @Override 
    public void onClick(ClickEvent event) { 
     ... 
    } 
}); 

だから私見これは、私はそれが行われるべき信じ方法です

+0

完全な答えをありがとう。確かに非常に役立つ – orad

関連する問題