java – Vaadin 7组合框 – 如何在键入文本时填充和下拉?
作者:互联网
我有一个应用程序,其中包含各种数据库记录的编辑器.这些记录是相互引用的.我正在开发一个基于ComboBox的新的自定义数据感知组件:
public abstract class CustomDbLookupField<T> extends CustomField<T> implements Field<T>
这就是我想要的:
>该组件看起来像一个组合框(我可以轻松地做到这一点)
>当相应字段具有行id值时,组件将显示该引用记录的文本表示(我也可以这样做)
>当用户开始在组合框中键入文本时,我想在数据库中搜索关键字,并用这些项填充组合框,然后让
>为他下拉组合框,然后从结果中选择
我似乎无法完成最后两部分.我想将监听器绑定到“文本键入组合框”事件,但我找不到任何方法.此外,我不知道如何获取刚刚输入的文本.我正在尝试这样做:
cmb.addListener(com.vaadin.event.FieldEvents.TextChangeEvent.class,target, method);
但我不知道参数target和method要传递什么.
解决方法:
这是一个很好的问题,也是一个无法用几句话回答的问题.我会先尝试给你一个简短的答案,然后再尝试详细说明.我目前正在攻击一个小例子来演示你想要实现的功能.但我需要更多时间.我会在得到一些结果后立即更新我的答案.
在此之前,对您的问题的简短回答是,如果您在组件上注册TextChangeEvents的侦听器,则需要有人实际触发这些事件.这通常发生在客户端,例如在TextField中.从CustomField派生时,您仍需要提供一些客户端实现. CustomField只是自定义字段实现的基础实现,没有大量现成的客户端功能.因此,在您的情况下,实际上永远不会调用TextChangeEvents的侦听器.
通过从ComboBox派生,您可以轻松完成.当在ComboBox中键入文本时,ComboBox已经内置了对前缀过滤的支持.实际的过滤器功能在Container中实现,Container是ComboBox的数据源.诀窍是覆盖受保护的方法ComboBox#getOptionsWithFilter(boolean)以在数据库中过滤并使用自定义Container实现,该实现提供来自数据库的过滤项.
更新:正如所承诺的,我编写了一个小型演示应用程序,该应用程序显示了如何编写自定义ComboBox,当用户在文本中键入时,其项目将从数据库中动态填充.这可以通过从ComboBox派生并通过覆盖方法com.vaadin.ui.ComboBox.buildFilter(String,FilteringMode)来实现.重写的方法将需要返回一个自定义的Container.Filter实现,该实现只是将当前过滤器String转移到自定义的com.vaadin.data.Container实现.然后,容器负责从数据库中提取过滤的项目并使用查询结果填充自身.在我的示例中,我派生自BeanItemContainer,我在重写方法中执行自定义数据库筛选de.oio.vaadin.SuggestingContainer.addFilter(Filter)
您可以在my GitHub project查看演示.不要犹豫,询问是否有任何不清楚的地方.
标签:java,combobox,vaadin7 来源: https://codeday.me/bug/20190612/1225653.html