Java 自动完成不匹配的结果
当我在ice中输入字符时,我正在尝试自动完成:选择InputText 我面临的问题是,当我键入字符时,它甚至会带来与我键入的字符不匹配的名称。 请参见下面的屏幕截图以供参考 理想情况下,autocomplete应该只显示结果的第一行,但是它显示的行与我键入的字符不匹配 仅应显示Abell Maryland 20606 这是用于比较的代码,我如何修改它以适应我的要求,即仅显示与我键入的内容匹配的结果Java 自动完成不匹配的结果,java,jsf,icefaces-1.8,Java,Jsf,Icefaces 1.8,当我在ice中输入字符时,我正在尝试自动完成:选择InputText 我面临的问题是,当我键入字符时,它甚至会带来与我键入的字符不匹配的名称。 请参见下面的屏幕截图以供参考 理想情况下,autocomplete应该只显示结果的第一行,但是它显示的行与我键入的字符不匹配 仅应显示Abell Maryland 20606 这是用于比较的代码,我如何修改它以适应我的要求,即仅显示与我键入的内容匹配的结果 public int compare(Object o1, Object o2) {
public int compare(Object o1, Object o2) {
if (o1 instanceof SelectItem) {
s1 = ((SelectItem) o1).getLabel();
} else {
s1 = o1.toString();
}
if (o2 instanceof SelectItem) {
s2 = ((SelectItem) o2).getLabel();
} else {
s2 = o2.toString();
}
return s1.compareToIgnoreCase(s2);
}
};
我从Icefaces开始学习本教程
更新
我在autocomplete.jspx中的代码
<ice:selectInputText rows="10" width="300"
listVar="emp"
valueChangeListener="#{mybean.updateList}"
listValue="#{mybean.list}">
<f:facet name="selectInputText">
<ice:panelGrid columns="3" columnClasses="empNameCol">
<ice:outputText value="#{emp.empName}"/>
</ice:panelGrid>
方法集匹配
private void setMatches(ValueChangeEvent event) {
Object searchWord = event.getNewValue();
int maxMatches = ((SelectInputText)event.getComponent()).getRows();
List matchList = new ArrayList(maxMatches);
try {
int insert =
Collections.binarySearch(dictionary, searchWord, AutoCompleteDictionary.LABEL_COMPARATOR);
if (insert < 0) {
insert = Math.abs(insert) - 1;
}
for (int i = 0; i < maxMatches; i++) {
if ((insert + i) >= dictionary.size() || i >= maxMatches) {
break;
}
matchList.add(dictionary.get(insert + i));
}
} catch (Throwable e) {
e.printStackTrace();
logger.error("Erorr finding autocomplete matches" + e.getMessage());
}
if (this.matchesList != null) {
this.matchesList.clear();
this.matchesList = null;
}
this.matchesList = matchList;
private void setMatches(ValueChangeEvent事件){
Object searchWord=event.getNewValue();
int maxMatches=((SelectInputText)event.getComponent()).getRows();
列表匹配列表=新的ArrayList(maxMatches);
试一试{
int insert=
集合。二进制搜索(字典、搜索词、自动完成字典、标签\比较器);
如果(插入<0){
insert=数学abs(insert)-1;
}
对于(int i=0;i=dictionary.size()| | i>=maxMatches){
打破
}
add(dictionary.get(insert+i));
}
}捕获(可丢弃的e){
e、 printStackTrace();
logger.error(“Erorr查找自动完成匹配项”+e.getMessage());
}
if(this.matchesList!=null){
这个.matchesList.clear();
this.matchesList=null;
}
this.matchesList=匹配列表;
}
更新2
改进的setMatches方法
private void setMatches(ValueChangeEvent event) {
Object searchWord = event.getNewValue();
int maxMatches = ((SelectInputText) event.getComponent()).getRows();
List matchList = new ArrayList(maxMatches);
try {
for(int i = 0; i < dictionary.size(); i++) {
SelectItem s = (SelectItem)dictionary.get(i);
if(s.getLabel().startsWith(searchWord.toString())) {
matchList.add(s);
if(matchList.size() == maxMatches)
break;
}
}
} catch (Throwable e) {
e.printStackTrace();
logger.error("Erorr finding autocomplete matches" + e.getMessage());
}
if (this.matchesList != null) {
this.matchesList.clear();
this.matchesList = null;
}
this.matchesList = matchList;
}
private void setMatches(ValueChangeEvent事件){
Object searchWord=event.getNewValue();
int maxMatches=((SelectInputText)event.getComponent()).getRows();
列表匹配列表=新的ArrayList(maxMatches);
试一试{
for(int i=0;i
您必须更新SelectItems列表。不只是对列表进行排序,您必须过滤列表(或者创建一个只包含匹配项的新列表)。下次自动完成列表呈现时,它将再次计算绑定列表
icefaces教程附带了一些源代码(底部)。看看自动完成bean
。方法updateList(ValueChangeEvent e)
调用setMatches(e)
。在这个方法中,列表被分配了一个新的列表
// assign new matchList
if (this.matchesList != null) {
this.matchesList.clear();
this.matchesList = null;
}
this.matchesList = matchList;
这会导致ui组件仅显示与输入匹配的项
总之:ice:selectInputList
将始终显示其列表中包含的项目,因此减少列表中的项目以仅显示相关项目
问候
更新
private void setMatches(ValueChangeEvent事件){
Object searchWord=event.getNewValue();
int maxMatches=((SelectInputText)event.getComponent()).getRows();
列表匹配列表=新的ArrayList(maxMatches);
试一试{
for(int i=0;i
更新2(简短版本)
/**
*用给定的luceneResult填充suggestionList。
*
*@param suggestion列出要填充的列表。
*@param luceneResult先前计算的luceneResult。
*/
私有静态无效fillLookupSuggestionList(最终列表suggestionList,
LuceneResult(LuceneResult)
{
suggestionList.clear();
字符串searchQuery=luceneResult.getLuceneResultConfig().getSearchQuery();
如果(luceneResult.getResultSize(),您必须更新SelectItems列表。您不必对列表进行排序,而必须过滤列表(或创建一个只包含匹配项的新列表)。下次自动完成列表呈现时,它将再次计算绑定列表
icefaces教程附带了一些源代码(底部)。请查看AutoCompleteBean
。方法updateList(ValueChangeEvent e)
调用setMatches(e)
。在此方法中,列表被分配了一个新的
// assign new matchList
if (this.matchesList != null) {
this.matchesList.clear();
this.matchesList = null;
}
this.matchesList = matchList;
这会导致ui组件仅显示与输入匹配的项
总之:ice:selectInputList
将始终显示其列表中包含的项目,因此减少列表中的项目以仅显示相关项目
问候
更新
private void setMatches(ValueChangeEvent事件){
Object searchWord=event.getNewValue();
int maxMatches=((SelectInputText)event.getComponent()).getRows();
列表匹配列表=新的ArrayList(maxMatches);
试一试{
for(int i=0;iprivate void setMatches(ValueChangeEvent event) {
Object searchWord = event.getNewValue();
int maxMatches = ((SelectInputText)event.getComponent()).getRows();
List matchList = new ArrayList(maxMatches);
try {
for(int i = 0; i < dictionary.size(); i++) {
SelectItem s = dictionary.get(i);
if(s.getLabel().startsWith(searchWord)) {
matchList.add(s);
if(matchList.size() == maxMatches)
break;
}
}
} catch (Throwable e) {
e.printStackTrace();
logger.error("Erorr finding autocomplete matches" + e.getMessage());
}
if (this.matchesList != null) {
this.matchesList.clear();
this.matchesList = null;
}
this.matchesList = matchList;
}
// note: not optimized, just to explain how to do.
/**
* Fills the suggestionList with the given luceneResult.
*
* @param suggestionList The list to fill.
* @param luceneResult The previously computed luceneResult.
*/
private static void fillLookupSuggestionList(final List<SelectItem> suggestionList,
LuceneResult luceneResult)
{
suggestionList.clear();
String searchQuery = luceneResult.getLuceneResultConfig().getSearchQuery();
if (luceneResult.getResultSize() <= 0)
{
suggestionList.add(new SelectItem(null, BundleHelper.i18n(LuceneLookupController.BUNDLE,
LuceneLookupController.NO_ITEM_FOUND)));
}
else
{
List<LuceneResultEntry> results = luceneResult.getResult();
for (LuceneResultEntry entry : results)
{
suggestionList.add(new SelectItem(entry.getMetaInfo(),
entry.getInfo().getDescription()));
}
}
}