Combobox对" .setValue()"没有反应。也不是" .select()"

时间:2015-08-12 13:50:29

标签: java combobox vaadin

这是我的代码:

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设置"的效果非常好。只有组合框拒绝像它应该的那样工作。

输出如下:

enter image description here

我尝试使用.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);
}

这并没有改变任何事情。组合框仍然是空的:

empty even with immediate set

2 个答案:

答案 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论坛上有很多关于如何实现这些方法的例子:

ComboBox select value problem

Select or ComboBox does not Show Selected Property

Combobox select/setValue