【问题标题】:How to override/remove default handler in GWT widget?如何覆盖/删除 GWT 小部件中的默认处理程序?
【发布时间】:2011-02-18 01:18:04
【问题描述】:

我想更改 GWT 中 SuggestBox 的行为。我想通过按 ENTER 提交值。但是 SuggestBox 有一个 KeyHandler,它可以捕获任何输入键并设置一个新的选择。我正在寻找删除/覆盖此处理程序的解决方案。

该方法由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?通过扩展类和覆盖私有方法有什么好的解决方案吗?

【问题讨论】:

    标签: java gwt


    【解决方案1】:

    不幸的是,该方法是私有的,除非您直接复制源代码并更改该方法,否则您将无法覆盖该方法。我认为您最好的选择是创建一个 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);
    

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

    编辑:

    我应该提到,您可能实际上想要扩展 TextBoxBase 的子类,例如 TextBoxTextArea 而不是直接扩展 TextBoxBase,因此您不必重新实现这些小部件的基本文本输入功能.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-30
      • 2016-04-13
      • 1970-01-01
      • 2015-10-07
      • 2020-11-27
      • 1970-01-01
      • 2023-03-04
      • 2018-06-21
      相关资源
      最近更新 更多