Vaadin 7组合框 - 如何在键入文本时填充和下拉?

nag*_*lzs 4 java combobox vaadin7

我有一个应用程序,其中包含各种数据库记录的编辑器.这些记录是相互引用的.我正在开发一个基于ComboBox的新的自定义数据感知组件:

public abstract class CustomDbLookupField<T> extends CustomField<T> implements Field<T> 
Run Code Online (Sandbox Code Playgroud)

这就是我想要的:

  • 该组件看起来像一个组合框(我可以轻松地做到这一点)
  • 当相应的字段有行id值时,组件显示该引用记录的文本表示(我也可以这样做)
  • 当用户开始在组合框中键入文本时,我想在数据库中搜索关键字,并用这些项填充组合框,然后让
  • 为他下拉组合框,然后从结果中选择

我似乎无法完成最后两部分.我想将监听器绑定到"文本键入组合框"事件,但我找不到任何方法.此外,我不知道如何获取刚刚输入的文本.我正在尝试这样做:

cmb.addListener(com.vaadin.event.FieldEvents.TextChangeEvent.class,target, method);
Run Code Online (Sandbox Code Playgroud)

但我不知道参数target和method要传递什么.

Rol*_*ger 7

这是一个很好的问题,也是一个无法用几句话回答的问题.我会先尝试给你一个简短的答案,然后再尝试详细说明.我目前正在攻击一个小例子来演示你想要实现的功能.但我需要更多时间.我会在得到一些结果后立即更新我的答案.

在此之前,对您的问题的简短回答是,如果您在组件上注册TextChangeEvents的侦听器,则需要有人实际触发这些事件.这通常发生在客户端,例如在TextField.当你从中衍生出来CustomField时仍然需要提供一些客户端实现.CustomField只是您的自定义字段实现的基本实现,没有大量现成的客户端功能.因此,在您的情况下,TextChangeEvents实际上永远不会调用侦听器.

通过从ComboBox派生,您可以轻松完成.当在ComboBox中键入文本时,ComboBox已经内置了对前缀过滤的支持.实际的过滤器功能是在ContainerComboBox的数据源中实现的.诀窍是覆盖受保护的方法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)

您可以在我的GitHub项目中查看演示.不要犹豫,询问是否有任何不清楚的事情.