如何修复GWT中mySuggestBox.addKeyDownHandler和mySuggestBox.addSelectionHandler之间的冲突?

如何修复GWT中mySuggestBox.addKeyDownHandler和mySuggestBox.addSelectionHandler之间的冲突?,gwt,Gwt,我有一个建议箱。我想要两样东西: -首先,当用户输入一个单词时,如果SuggestOracle建议任何单词&然后如果我通过在所选单词上按Enter键或单击该单词来选择该单词,它将调用methodX -2st,假设我在一个suggest中键入一个单词&SuggestOracle不建议任何单词,那么我希望当我按Enter键时,它将触发methodX 以下代码符合第1条要求 getView().getSuggestBox().addSelectionHandler(new SelectionHandl

我有一个建议箱。我想要两样东西:

-首先,当用户输入一个单词时,如果SuggestOracle建议任何单词&然后如果我通过在所选单词上按Enter键或单击该单词来选择该单词,它将调用methodX

-2st,假设我在一个suggest中键入一个单词&SuggestOracle不建议任何单词,那么我希望当我按Enter键时,它将触发methodX

以下代码符合第1条要求

getView().getSuggestBox().addSelectionHandler(new SelectionHandler(){

    @Override
    public void onSelection(SelectionEvent event) {


        methodX();
    }

});
getView().getSuggestBox().addKeyDownHandler(new KeyDownHandler(){
    @Override
    public void onKeyDown(KeyDownEvent event) {

        if(event.getNativeKeyCode() == KeyCodes.KEY_ENTER) {
            methodX();
        }
    }

});
以下代码满足第二个要求

getView().getSuggestBox().addSelectionHandler(new SelectionHandler(){

    @Override
    public void onSelection(SelectionEvent event) {


        methodX();
    }

});
getView().getSuggestBox().addKeyDownHandler(new KeyDownHandler(){
    @Override
    public void onKeyDown(KeyDownEvent event) {

        if(event.getNativeKeyCode() == KeyCodes.KEY_ENTER) {
            methodX();
        }
    }

});
然而,如果我同时使用这两种方法,那么我就遇到了这个问题

例如,当我键入“建议oracle显示汽车保险汽车购买”时,然后当我使用向下箭头键选择汽车购买并点击回车键时,系统调用methodXcar;不是methodXcar买的

有什么问题?我想他们是有冲突还是怎么了


如何修复它?

我认为您只需要向


据我所知,如果在框中按enter键,则会触发此事件。

无需注册两个处理程序。这可以通过如下所示的单个处理程序来实现,当通过鼠标单击或按enter键选择事件值时,将触发该处理程序

suggestionBox.addSelectionHandler(new SelectionHandler<SuggestOracle.Suggestion>() {

    @Override
    public void onSelection(SelectionEvent<Suggestion> event) {
        System.out.println("selection changed :" + event.getSelectedItem().getDisplayString());
        methodX();
    }
});
如果没有任何效果,请尝试使用下面的处理程序

suggestionBox.getValueBox().addValueChangeHandler(new ValueChangeHandler<String>() {

    @Override
    public void onValueChange(ValueChangeEvent<String> event) {
        System.out.println("value changed :" + event.getValue());
    }
});

我认为您应该尝试使用自定义SelectionHandler类,并使用

getDisplayString and getReplacementString
以下是我的代码的快速复制/粘贴:

public class SearchStuff Composite implements SelectionHandler<ItemSuggestion> {

    @Override
    public void onSelection(SelectionEvent<ItemSuggestion> event) {

    System.out.println(" getDisplayString( )     = " + event.getSelectedItem().getDisplayString()) ;

    System.out.println("getReplacementString( ) = " + event.getSelectedItem().getReplacementString());


}


public class ItemSuggestion implements IsSerializable, com.google.gwt.user.client.ui.SuggestOracle.Suggestion{ 
    @Override
    public String getReplacementString() {
      ....
    }
}

当通过鼠标单击或输入键选择任何项目时,无需添加SelectionHandler已经处理的KeyDownHandler。使用suggestionBox.getText获取处理程序中的值,如果KeyPressHandler或KeyUpHandler不起作用,则尝试使用KeyDownHandler或KeyUpHandler代替KeyDownHandler。问题是我在methodX中获得了验证代码,如果suggestBox为空,那么它将弹出一条消息,因此如果我确实像你建议的那样,那么每次单击suggestBox时,它都会弹出一条错误消息。你能找到更好的方法吗?我试着只使用1个处理程序suggestionBox.addSelectionHandler&结果是,如果我键入cat&suggestionOracle show nothing&如果我按Enter键,如果我使用.addValueChangeHandler,则没有发生任何事情,因为存在NovalueChange。如果我使用.addValueChangeHandler,则如果SuggestOracle建议任何文本&如果我按Enter键选择它,则它不会像我所说的那样捕获建议的文本;如果我同时使用这两个选项,则如果我按Enter键,则仅捕获旧文本,而不是从建议列表中获取的文本。