这是我的代码:
comboBoxInstance.setInputPrompt("Something...");
comboBoxInstance.setNullSelectionAllowed(false);
Cookie comboCookie = getCookieByName("combo");
comboBoxInstance.select((comboCookie != null) ? comboCookie.getValue() : null);
final TextField textFieldInstance = new TextField("Textfield");
textFieldInstance.setInputPrompt("Something...");
Cookie tfCookie = getCookieByName("tf");
textFieldInstance.setValue((tfCookie != null) ? tfCookie.getValue() : null);
问题是文本字段与" Cookie设置"的效果非常好。只有组合框拒绝像它应该的那样工作。
输出如下:
我尝试使用.setValue()
代替.select()
,但这具有几乎相同的效果。我还确保提供Cookie本身和正确的值。
查看生成cookie的部分可能会有所帮助:
Cookie comboCookie = new Cookie("combo", comboBoxInstance.getValue().toString());
cookieProcessing(costcentreCookie); //<- sets maxage and vaadin related stuff (like adding the cookie)
修改
数据流的几点。
我使用SimpleJDBCConnectionPool的SQLContainer作为数据容器(来自TableQuery)生成一个ComboBox。这是组合框类中的初始化(在构造函数中执行):
private void init() throws SQLException {
this.setContainerDataSource(generateContainer());
this.setItemCaptionPropertyId("something");
}
私有方法generateContainer()
当然会返回SQLContainer。
如果我点击打开对话框的特定按钮,就会发生这种情况。该对话框是上图所示的片段。组合框 - 当然 - 是其中的一部分。
现在应该做的是设置他的数据(获取ComboBox的项目)并点击保存。保存按钮执行存储cookie的例程。它是上面已经提到的代码(Cookie comboCookie = new Cookie(...
)。
好的,现在用户将再次打开对话框。重新加载应用程序或重新打开对话框(或做其他事情)并不重要。它在应用程序中基本相同。
该对话框打开并再次初始化组合框(和文本字段)。但是,这次它应该从存储的cookie中收集数据。这是问题发生了。这适用于文本字段(有两个但我省略了一个缩短原因)但不适用于组合框,即使它应该具有与以前完全相同的数据。请记住,它与完全相同的类完全相同,就像我们首先存储cookie一样。
我有一个模糊的假设,它必须做一些代码堆叠的事情。也许它还没有完成加载datacontainer,同时试图设置适当的值,然后找不到。
EDIT2 :
我终于设法透露了一些东西。当&#34; .select()&#34;时,ComboBox确实是空的。被执行。但是,这意味着,ComboBox保持不变(它只是&#34;链接&#34;到datacontainer),直到有人放下项目。一旦发生这种情况,物品就在那里,我可以选择它们。
它应该像这样工作吗? O.o我能在我做其他事情之前完全初始化组合框吗?类似的东西:
private void init() throws SQLException {
this.setContainerDataSource(generateContainer());
this.setItemCaptionPropertyId("something");
this.gatherTheItems();
}
编辑3 - 使用&#34; .setImmediate(true)进行测试&#34;
我已将init更改为:
private void init() throws SQLException {
this.setContainerDataSource(generateContainer());
this.setItemCaptionPropertyId("SOMETHING");
this.setImmediate(true);
}
这并没有改变任何事情。组合框仍然是空的:
答案 0 :(得分:2)
最后!起初我找到了一个像这样的解决方法:
for (Iterator it_IDS = combobox.getItemIds().iterator(); it_IDS.hasNext();) {
Object id = (Object) it_IDS.next();
if(id.toString().equals(cookie.getValue().toString())){
combo2.select(id);
break;
}
}
然而,我无法相信这是有效的,因为它不会改变任何核心问题。所以我调查过,RowID是通过BigDecimal和voilà构建的:
if(cookie != null) {
combobox.select(new RowId(new BigDecimal(cookie.getValue())));
}
我现在很高兴:)感谢您的耐心kukis。
答案 1 :(得分:0)
如果您来到这里是因为您使用BeanItemContainer作为数据源时遇到了同样的问题,请记住您必须在ComboBox的{{{{{{{{{{{{} {{{ 1}}或equals()
方法。
你在Vaadin论坛上有很多关于如何实现这些方法的例子: