ICEfaces(JSF)3.3.0 SelectInputText Enter键不会从列表中选择项目

ICEfaces(JSF)3.3.0 SelectInputText Enter键不会从列表中选择项目,jsf,autocomplete,icefaces,Jsf,Autocomplete,Icefaces,我对ICEfaces 3.3.0 SelectInputText有一些问题 以下场景: 情景1: 在条目中键入d 我得到了自己的名单。笨蛋,笨蛋2。。。 现在,当我用鼠标左键单击它来选择Dummy时,指定为selectInputText.value的值被设置为Dummy expected behavior 情景2: 在条目中键入d 我得到了自己的名单。笨蛋,笨蛋2。。。 现在,当我用courser键滚动选择Dummy并按Enter键时,我得到的值设置为d而不是Dummy。? 情景3: 在条目中键

我对ICEfaces 3.3.0 SelectInputText有一些问题

以下场景:

情景1:

在条目中键入d 我得到了自己的名单。笨蛋,笨蛋2。。。 现在,当我用鼠标左键单击它来选择Dummy时,指定为selectInputText.value的值被设置为Dummy expected behavior 情景2:

在条目中键入d 我得到了自己的名单。笨蛋,笨蛋2。。。 现在,当我用courser键滚动选择Dummy并按Enter键时,我得到的值设置为d而不是Dummy。? 情景3:

在条目中键入d 我得到了自己的名单。笨蛋,笨蛋2。。。 现在,当我使用courser键滚动选择Dummy并按下Ctrl+Enter键时,我将该值设置为Dummy。预期的行为。 我还将actionListener添加到selectInputText.actionListener以查看发生了什么:

在场景2中,actionListener调用了两次:检查第一个actionListener中的值是否包含d,接下来的第二个调用是否包含Dummy

我知道当您不从下拉列表中选择任何内容并按Enter键时,该值将设置为selectInputText中输入的文本,这也是一种预期行为,如文档所示,但在我的情况下是场景2 为什么actionListener调用了两次?也就是说,在第一次调用时按Enter键不会选择该项目

这是一只虫子还是我错过了什么

提前谢谢

代码如下:

                    <ice:selectInputText

                        value="#{controller.selectedText}"
                        actionListener="#{controller.doSubmitText}"
                        textChangeListener="#{controller.textChangedEvent}"
                        rows="0" 
                        width="300"
                        listVar="person"
                        listValue="#{controller.persons}"> 
                        <f:facet name="selectInputText">
                            <h:panelGrid id="f"
                                columns="2" width="100%"
                                columnClasses="col75,col25">
                                <ice:outputLabel value="#{person.name}"/>
                                <ice:outputLabel value="#{person.username}"/>
                            </h:panelGrid>
                        </f:facet>
                    </ice:selectInputText>
下面是Bean scope=session的相关部分

private List<SelectItem> persons;
public List<SelectItem> getPersons() {
    return persons;
}

public void setPersons(List<SelectItem> persons) {
    this.persons= persons;
}

private String selectedText = null;

public String getSelectedText() {
    return selectedText;
}

public void setSelectedText(String selectedText) {
    this.selectedText = selectedText;
}

public void textChangedEvent(TextChangeEvent ev) {
    personlist = getfilteredList(ev.getNewValue().toString());
}

public void doSubmitText(ActionEvent event) {
    System.out.println(selectedText);
}   

场景2行为的原因是IceFaces生命周期和事件的处理方式。听众总是被呼叫两次

考虑到您正在侦听器中使用此代码,它的执行是由事件触发的。事件有一个阶段,告诉框架您希望在生命周期的哪个部分处理它们

通过谷歌搜索JSF生命周期,您可以了解更多关于生命周期的信息

对于您的特殊问题,您必须检查正确的相位并设置值,将其放在侦听器方法的开头:

if (!event.getPhaseId().equals(PhaseId.INVOKE_APPLICATION)) {
        event.setPhaseId(PhaseId.INVOKE_APPLICATION);
        event.queue();
        return true;
    }

谢谢你提供的信息,但这没有多大帮助。我正在line event.setPhaseId上设置断点,但断点从未在此断点处停止。在我发表第一篇文章之前,我已经玩过PhaseId,但它总是调用应用程序。你的评论是一个很好的提示。2次呼叫。我刚刚重新实现了我的代码,现在我得到了我想要的。谢谢