【问题标题】:Vaadin 7 Combo Box - how to populate and dropdown when text is typed?Vaadin 7 Combo Box - 输入文本时如何填充和下拉?
【发布时间】:2014-04-28 11:37:05
【问题描述】:

我有一个应用程序可以编辑各种数据库记录。这些记录相互引用。我正在开发一个基于 ComboBox 的新的自定义数据感知组件:

public abstract class CustomDbLookupField<T> extends CustomField<T> implements Field<T> 

这就是我想要的:

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

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

cmb.addListener(com.vaadin.event.FieldEvents.TextChangeEvent.class,target, method);

但我不知道为参数目标和方法传递什么。

【问题讨论】:

    标签: java combobox vaadin7


    【解决方案1】:

    这是一个很好的问题,而且不是几句话就能回答的。我会尽量先给你一个简短的答案,稍后再详细说明。我目前正在编写一个小示例来演示您想要实现的功能。但我还需要一些时间。一有结果,我就会更新我的答案。

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

    您可以通过从 ComboBox 派生来轻松得多。当在 ComboBox 中输入文本时,ComboBox 已经内置了对前缀过滤的支持。实际的过滤器功能在 Container 中实现,它是 ComboBox 的数据源。 诀窍是覆盖受保护的方法ComboBox#getOptionsWithFilter(boolean) 以在数据库中进行过滤,并使用自定义的Container 实现来提供数据库中过滤的项目。

    更新:正如所承诺的,我编写了一个小型演示应用程序,它展示了如何编写一个自定义 ComboBox,当用户键入文本时,它的项目从数据库中动态填充。这可以通过从ComboBox 和覆盖方法com.vaadin.ui.ComboBox.buildFilter(String, FilteringMode) 派生的简单hack 来实现。被覆盖的方法需要返回一个自定义的Container.Filter 实现,它只是将当前过滤器字符串传递给一个自定义的com.vaadin.data.Container 实现。然后容器负责从数据库中获取过滤后的项目并使用查询结果填充自己。在我的示例中,我从 BeanItemContainer 派生,在那里我在重写方法 de.oio.vaadin.SuggestingContainer.addFilter(Filter) 中进行自定义数据库过滤

    您可以在my GitHub project 查看演示。有什么不清楚的请不要犹豫。

    【讨论】:

    • 我接受这个答案,因为这是唯一一个,至少这解释了为什么它不起作用。我发现任何人都可以注册任何事件,即使它对组件无效,这尤其令人不安。我不会编写自定义 Javascript 模块。我最终使用了 PopupButton 和 TextField + ListSelect 的组合。看起来不太好,但至少可以开箱即用。
    猜你喜欢
    • 2017-01-28
    • 1970-01-01
    • 2021-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-20
    • 1970-01-01
    • 2012-05-18
    相关资源
    最近更新 更多