如何覆盖/删除GWT小部件中的默认处理程序?

时间:2011-02-18 01:18:05

标签: java gwt

我想在GWT中更改SuggestBox的行为。我想通过按ENTER提交值。然而,SuggestBox有一个KeyHandler,它捕获任何回车键并设置一个新的选择。我正在寻找一个删除/覆盖此Handler的解决方案。

此方法由SuggestBox

中的构造函数调用
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);

}

是否可以使用HandlerRegistration从框中删除此Handler?通过扩展类和重写私有方法有什么好的解决方案吗?

1 个答案:

答案 0 :(得分:0)

不幸的是,由于该方法是私有的,除非您直接复制源并以这种方式更改方法,否则您将无法覆盖该方法。我认为你最好的选择是创建一个SuggestBox实例并传递一个TextBoxBase的自定义实现,然后你可以覆盖事件/处理程序行为。请注意,addEventsToTextBox()将该内部类挂接到在调用box之前在构造函数中设置的addEventsToTextBox()成员变量。

类似于以下内容:

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

然后将其与您的SuggestBox实例一起使用:

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

根据您的具体情况,这可能不是一个理想的解决方案,在这种情况下,看一些代码片段显示您对它的使用会很有帮助。

修改

我应该提一下,您可能实际上想要扩展TextBoxBase的子类,例如TextBoxTextArea而不是TextBoxBase,这样您就不必重新实现基本的这些小部件的文本输入功能。