如何在Vaadin中绑定表单中的LazyQueryContainer和Combobox?

时间:2012-09-02 20:42:15

标签: java combobox datasource vaadin

我目前正在使用Vaadin 6.8.1 + Spring 3进行一个项目,它是一个Vaadin接口,可以调用Spring服务(后面是Hibernate)。

感谢LazyQueryContainer(LQC),我可以从服务中加载我的数据并将其显示在Vaadin表和组合框中。在这一点上,一切都很好,很棒。但是,我有一个包含组合框的表单,其中包含来自LQC的数据,当调用表单的setItemDataSource方法时,该表单无法正确选择正确的项目。

例如,我的应用程序管理数据库中的人员和公司列表。有两个类:人和公司。这种关系就像一个人是公司的一员一样简单。因此,Person类有一个公司类型的现场公司。 现在,我有一个管理一个人的Vaadin表格。在这种形式中,组合框显示数据库中的所有公司,所选公司是该人注册的公司。

由于我的应用程序分为服务,我不能使用JPAContainer或HibernateContainer直接访问我的数据。然后我选择了LazyQueryContainer及其AbstractBeanQuery。我为Person和Company类创建了一个数据源,它们在表和组合框中正确显示。 Vaadin表格也正确显示文本输入中的Person的字符串字段。

但是,我想使用组合框而不是默认文本框来管理公司字段。因此,我实现了一个FormFieldFactory并将该字段绑定到组合框。确实没有更多的默认公司文本框,这意味着绑定工作正常,但组合框中的选定值为空(null)。

我在Company类中实现了equals和hashcode方法,但它没有改变任何东西。我还想我应该加载组合框中的所有数据(因为项目数量很少)但我不知道如何从LQC对象手动获取对象。没有源代码,就无法进行调试。

非常欢迎任何帮助。 谢谢。

1 个答案:

答案 0 :(得分:1)

我认为您的问题是LazyQueryContainer使用Long作为项ID,但Vaadin表单正在尝试将您的Company设置为组合框值。由于此id(Company实例)不是LazyQueryContainer id列表的一部分,因此选择保持为空。

您需要首先找到Company分配给它的LazyQueryContainer的ID,然后将该值设置为组合框。您还需要创建一个自定义字段并将ComboBox子类化,以便在表单调用时处理setValue

旁注:Vaadin BeanItemContainer使用您的JavaBean作为项目ID。这就是myCombo.setValue (myCompany)有效的原因。

相关问题