Combobox 瓦丁组合盒&;LQC

Combobox 瓦丁组合盒&;LQC,combobox,containers,vaadin,Combobox,Containers,Vaadin,有人能提供数据绑定select和LazyQueryContainer的完整示例吗?也欢迎使用其他容器进行绑定。(方法中的LQC包含容器中的预期索引而不是项-这是不同的行为) 我无法使用简单的示例: 第一个表:货币(ID、代码、名称)。。。。{1美元,多拉;2欧元,欧元} 第二个表交换率(ID、CcyFrom、CcyTo、汇率、ValidFrom)。。。{1,1,2,1.5152011/01/01;…} 我有一个容器,其中包含来自Currency的所有记录。我将其设置为选择的源 Select re

有人能提供数据绑定select和LazyQueryContainer的完整示例吗?也欢迎使用其他容器进行绑定。(方法中的LQC包含容器中的预期索引而不是项-这是不同的行为)

我无法使用简单的示例:

第一个表:货币(ID、代码、名称)。。。。{1美元,多拉;2欧元,欧元} 第二个表交换率(ID、CcyFrom、CcyTo、汇率、ValidFrom)。。。{1,1,2,1.5152011/01/01;…}

我有一个容器,其中包含来自Currency的所有记录。我将其设置为选择的源

Select result = new Select("Select currency", currencies);        result.setItemCaptionMode(Select.ITEM_CAPTION_MODE_PROPERTY);        result.setItemCaptionPropertyId("code");
它很好用

我有第二个容器,其中包含一些选择的ExchangeRate。我将其绑定到表单,将TextField替换为select。 现在我想设置正确的值来选择。。。。但是select.setValue(newValue)不起作用,当我调试它时,我发现newValue不起作用;在集装箱上找不到。。。我怎样才能把它做好


《瓦丁书》中有几个例子,不幸的是,它们没有使用LQC或不使用LQC;'t将容器用于选择源(弹出窗口和值)

我正在使用Criteria容器(Lazy Query容器的子类),但是它似乎与ComboBox不兼容,因为LQC提供了需要该项的索引和ComboBox-请参阅

我使用的解决方法只是将所有实体加载到BeanItemContainer中,如下所示。在这种情况下,我只需要处理几千个条目,它的性能令人惊讶

  BeanItemContainer<Contact> bic = new BeanItemContainer<Contact>(Contact.class);
  List<Contact> contacts = dao.all(Contact.class, Contact_.lastName);
  bic.addAll(contacts);

  ComboBox cb = new ComboBox("Please select contact");
  cb.setContainerDataSource(bic);
BeanItemContainer bic=新的BeanItemContainer(Contact.class);
List contacts=dao.all(Contact.class,Contact.lastName);
bic.addAll(联系人);
组合框cb=新组合框(“请选择联系人”);
cb.setContainerDataSource(bic);

在开始缩放用户时,向组合框添加几千个项目是不可行的。记住,所有这些都隐藏在
HttpSession
中。如果你不小心的话,你的内存消耗会大增

我最近做了一个简单的测试,分析了一个应用程序,它使用了
IndexedContainer
BeanItemContainer
,消耗的内存量非常不同。测试中的
BeanItem
是一个持久的JPA实体,具有许多关系和属性。对于组合框,我们实际上只需要两个属性:id和name

BeanItemContainer
每个用户消耗50MB,而
IndexedContainer
每个用户消耗2MB。因此,正如您所看到的,如果您不小心会话中存储了什么类型的信息,它将无法很好地扩展。IMHO甚至2MB都不能令人满意,更好的设计应该使用惰性查询容器

BeanItemContainer
将创建每个字段/关联的副本,无论其中是否包含数据,这是内存差异的主要原因。Eclipse内存分析器插件非常适合分析堆转储:)

class EditViewTest{
专用组合框组合框
@试验
void serialize(){
BeanItemContainer=新的BeanItemContainer(组织)
addAll(getAllOrgs().sort({a,b->a.name b.name}))
comboBox=新的comboBox('组织',容器)
comboBox.setItemCaptionMode(选择.ITEM\u CAPTION\u MODE\u属性)
comboBox.setItemCaptionPropertyId(“名称”)
长文件长度
def temp=File.createTempFile('orgs','.ser'))
试一试{
temp.withObjectOutputStream{out->
出来
comboBox.addItem(org.id)
comboBox.setItemCaption(org.id,org.name)
}
长文件长度
def temp=File.createTempFile('orgs','.ser'))
试一试{
temp.withObjectOutputStream{out->

甚至这条线都有点旧了。。。 我认为另一个解决方案是使用带有分页的核心Vaadin容器。 这将确保客户设置最大记录数。 另一方面,我很好奇是否可以使用LazyQueryCOntainer使用遗留dao实现,而不是通过实现QUeryFactory接口。 任何反馈都是有帮助的。

SQLContainer
您要求提供其他容器类型示例。下面是的示例(请参阅)

以博客帖子为例 我在2012-11年的一篇帖子中发现了这个优秀而简单的例子。详细信息请参见帖子。下面是他的代码片段。我已经添加或修改了一些注释

代码片段 创建一个
loads
方法以返回容器数据源。此方法创建一个如下所示的SQLContainer

TableQuery q = new TableQuery("suburb", connectionPool);
suburbContainer = new SQLContainer(q);
调用该方法,将结果传递给combobox

ComboBox suburbCB = new ComboBox();
suburbCB.addItem("");
suburbCB.setCaption("Filter by Suburb");
suburbCB.setContainerDataSource(app.getDatabase().loadSuburbs());  // Hook-up SQLContainer.

// Specify which Property (field) in the SQLContainer to display as content in the ComboBox.
// If omitted, the 'id' Property appears as content.
suburbCB.setItemCaptionPropertyId("name");
suburbCB.setItemCaptionMode(AbstractSelect.ITEM_CAPTION_MODE_PROPERTY);

// Set a reasonable width
suburbCB.setWidth(350, UNITS_PIXELS);

// Set the appropriate filtering mode for this example, allowing user to type-ahead.
suburbCB.setFilteringMode(Filtering.FILTERINGMODE_STARTSWITH);
suburbCB.setImmediate(true);
ComboBox suburbCB = new ComboBox();
suburbCB.addItem("");
suburbCB.setCaption("Filter by Suburb");
suburbCB.setContainerDataSource(app.getDatabase().loadSuburbs());  // Hook-up SQLContainer.

// Specify which Property (field) in the SQLContainer to display as content in the ComboBox.
// If omitted, the 'id' Property appears as content.
suburbCB.setItemCaptionPropertyId("name");
suburbCB.setItemCaptionMode(AbstractSelect.ITEM_CAPTION_MODE_PROPERTY);

// Set a reasonable width
suburbCB.setWidth(350, UNITS_PIXELS);

// Set the appropriate filtering mode for this example, allowing user to type-ahead.
suburbCB.setFilteringMode(Filtering.FILTERINGMODE_STARTSWITH);
suburbCB.setImmediate(true);