2011-02-18 13 views
2

GWTのSuggestBoxの動作を変更したいと思います。私はENTERを押して値を送信します。ただし、SuggestBoxにはKeyHandlerがあり、Enterキーをキャッチして新しいSelectionを設定します。このHandlerを削除/上書きするソリューションを探しています。このメソッドは GWTウィジェットでデフォルトのハンドラをオーバーライド/削除する方法は?

private void addEventsToTextBox() { 
class TextBoxEvents extends HandlesAllKeyEvents implements 
    ValueChangeHandler<String> { 

    public void onKeyDown(KeyDownEvent event) { 
    switch (event.getNativeKeyCode()) { 
     case KeyCodes.KEY_DOWN: 
     display.moveSelectionDown(); 
     break; 
     case KeyCodes.KEY_UP: 
     display.moveSelectionUp(); 
     break; 
     case KeyCodes.KEY_ENTER: 
     case KeyCodes.KEY_TAB: 
     Suggestion suggestion = display.getCurrentSelection(); 
     if (suggestion == null) { 
      display.hideSuggestions(); 
     } else { 
      setNewSelection(suggestion); 
     } 
     break; 
    } 
    delegateEvent(SuggestBox.this, event); 
    } 

    public void onKeyPress(KeyPressEvent event) { 
    delegateEvent(SuggestBox.this, event); 
    } 

    public void onKeyUp(KeyUpEvent event) { 
    // After every user key input, refresh the popup's suggestions. 
    refreshSuggestions(); 
    delegateEvent(SuggestBox.this, event); 
    } 

    public void onValueChange(ValueChangeEvent<String> event) { 
    delegateEvent(SuggestBox.this, event); 
    } 
} 

TextBoxEvents events = new TextBoxEvents(); 
events.addKeyHandlersTo(box); 
box.addValueChangeHandler(events); 

}

SuggestBox

にコンストラクタによって呼び出され

はそれがHandlerRegistrationを使用してボックスから、このハンドラを削除することは可能ですか?クラスを拡張しプライベートメソッドをオーバーライドすることで素晴らしいソリューションがありますか?

答えて

0

残念ながら、メソッドはプライベートなので、ソースを直接コピーしてメソッドを変更しない限り、メソッドをオーバーライドすることはできません。あなたの最善の選択肢は、SuggestBoxのインスタンスを作成し、TextBoxBaseのカスタム実装を渡して、イベント/ハンドラーの動作をオーバーライドすることだと思います。 addEventsToTextBox()は、その内部クラスをaddEventsToTextBox()の呼び出しの前にコンストラクタで設定されたboxメンバ変数にフックアップすることに注意してください。次のような

何か:その後、

public class MyTextBox extends TextBox{ 
... 
// Override the handlers/events 
... 
} 

とSuggestBoxのインスタンスとそれを使用します。

MyTextBox myBox = new MyTextBox(...); 
SuggestBox sBox = new SuggestBox(oracle, myBox); 

特定の状況に応じて、これは場合の理想的なソリューションではないかもしれませんそれを使用していることを示すコードスニペットを見ると便利です。

EDIT:

私はあなたがおそらく実際には基本的なテキスト入力機能を再実装する必要はありません直接ので、このようなTextBoxTextAreaなくTextBoxBaseとしてTextBoxBaseのサブクラスを拡張することを言及する必要がありますそれらのウィジェットの

関連する問題