我想在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?通过扩展类和重写私有方法有什么好的解决方案吗?
答案 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的子类,例如TextBox
或TextArea
而不是TextBoxBase
,这样您就不必重新实现基本的这些小部件的文本输入功能。