Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Vaadin 7组合框-键入文本时如何填充和下拉?_Java_Combobox_Vaadin7 - Fatal编程技术网

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

Java Vaadin 7组合框-键入文本时如何填充和下拉?,java,combobox,vaadin7,Java,Combobox,Vaadin7,我有一个应用程序,它有各种数据库记录的编辑器。这些记录相互引用。我正在开发一个基于ComboBox的新的自定义数据感知组件: public abstract class CustomDbLookupField<T> extends CustomField<T> implements Field<T> 但我不知道该把什么作为参数目标和方法。这是一个好问题,几句话也回答不了。我会先给你一个简短的回答,然后再详细说明。我目前正在编写一个小示例来演示您想要实现的功

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

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

但我不知道该把什么作为参数目标和方法。

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

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

通过从ComboBox派生,您可以做得更简单。ComboBox已经内置了在ComboBox中键入文本时对前缀过滤的支持。实际的过滤器功能在
容器中实现,该容器是组合框的数据源。诀窍是覆盖受保护的方法
组合框#getOptionsWithFilter(boolean)
在数据库中进行筛选,并使用自定义的
容器
实现从数据库中提供筛选项

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


您可以在查看演示。如果有什么不清楚的地方,请不要犹豫。

我接受这个答案,因为这是唯一的答案,至少这解释了为什么它不起作用。我发现特别令人不安的是,任何人都可以注册任何事件,即使它对组件无效。我不会编写自定义Javascript模块。我最终使用了PopupButton和TextField+ListSelect的组合。看起来不太好,但至少它是开箱即用的。
cmb.addListener(com.vaadin.event.FieldEvents.TextChangeEvent.class,target, method);