如何使用BeanItemContainer通过id或value选择组合框?

时间:2014-09-10 05:06:15

标签: vaadin vaadin7

我使用BeanItemContainer为我的组合框来满足键值对。

@SuppressWarnings("serial")
public class ComboBoxItem implements Serializable {
private String id;
private String description;

public ComboBoxItem(final String id, final String description) {
    this.id = id;
    this.description = description;
}

public final void setId(final String id) {
    this.id = id;
}

public final void setDescription(final String description) {
    this.description = description;
}

public final String getId() {
    return id;
}

public final String getDescription() {
    return description;
}

}

我创建了一个样本组合框,如下所示

    List<ComboBoxItem> lstAuctionDateList = new ArrayList<ComboBoxItem>();
    lstAuctionDateList.add(new ComboBoxItem("all", "All"));
    BeanItemContainer<ComboBoxItem> auctionDateItems = new BeanItemContainer<ComboBoxItem>(ComboBoxItem.class,
            lstAuctionDateList);
    final ComboBox cbAuctionDate = new ComboBox("Auction Date", auctionDateItems);
    cbAuctionDate.addStyleName("small");
    cbAuctionDate.setNullSelectionAllowed(false);
    cbAuctionDate.setTextInputAllowed(false);
    cbAuctionDate.setItemCaptionPropertyId("description");
    cbAuctionDate.addValueChangeListener(new ValueChangeListener() {

        public void valueChange(final ValueChangeEvent event) {
            if (cbAuctionDate.getValue() != null) {
                System.out.println(((ComboBoxItem) cbAuctionDate.getValue()).getId());
                System.out.println(((ComboBoxItem) cbAuctionDate.getValue()).getDescription());
            }

        }
    });

没关系,但我无法使用以下代码选择任何组合框项目

    cbAuctionDate.select("all");
    cbAuctionDate.select("All");
    cbAuctionDate.setValue("all");
    cbAuctionDate.setValue("All");

我错了什么?如何通过编程方式选择我的combox?

3 个答案:

答案 0 :(得分:4)

当使用(bean)容器并添加项目时,项目本身的标识将用作容器中的itemId。例如。 cbActionDate.select(lstAuctionDateList[0])应该有用。

您要么让对象不可变,要么使用方法告诉容器,它必须用于id(例如setBeanIdProperty("id")setBeanIdResolver)。

使对象不可变现在应该很容易(使类和私有属性最终,删除setter并让IDE为您生成equalshashCode

答案 1 :(得分:3)

  1. 您不需要cbAuctionDate.addItem(“All”)调用,您的集合中已经有这样的项目

  2. 我会这样试试:

  3. List<ComboBoxItem> lstAuctionDateList = new ArrayList<ComboBoxItem>();
    ComboBoxItem allItems= new ComboBoxItem("all", "All");
    lstAuctionDateList.add(allItems);
    ....
    ...
    cbAuctionDate.select(allItems);
    

答案 2 :(得分:1)

现在我为我的问题创建了自定义ComboBox组件

public class ComboBox extends CustomComponent implements Serializable {
private com.vaadin.ui.ComboBox comboBox;
private BeanItemContainer<ComboBoxItem> entries = new BeanItemContainer<ComboBoxItem>(ComboBoxItem.class);

public ComboBox() {
    comboBox = new com.vaadin.ui.ComboBox();
    comboBox.addStyleName("small");
    comboBox.setNullSelectionAllowed(false);
    comboBox.setTextInputAllowed(false);
    setCompositionRoot(comboBox);
}
public ComboBox(final String caption) {
    comboBox = new com.vaadin.ui.ComboBox();
    comboBox.addStyleName("small");
    comboBox.setNullSelectionAllowed(false);
    comboBox.setTextInputAllowed(false);
    setCaption(caption);
    setCompositionRoot(comboBox);
}

public ComboBox(final String caption, final List<ComboBoxItem> items) {
    comboBox = new com.vaadin.ui.ComboBox();
    comboBox.addStyleName("small");
    comboBox.setNullSelectionAllowed(false);
    comboBox.setTextInputAllowed(false);
    setCaption(caption);
    if (items != null && items.size() > 0) {
        entries.addAll(items);
        comboBox.setContainerDataSource(entries);
        comboBox.setItemCaptionMode(ItemCaptionMode.PROPERTY);
        addItems(entries);
        comboBox.select(items.get(0));
        comboBox.setItemCaptionPropertyId("description");
    }

    setCompositionRoot(comboBox);
}
public final void addItems(final List<ComboBoxItem> items) {
    if (items != null && items.size() > 0) {
        entries.addAll(items);
        comboBox.setContainerDataSource(entries);
        comboBox.setItemCaptionMode(ItemCaptionMode.PROPERTY);
        addItems(entries);
        comboBox.select(items.get(0));
        comboBox.setItemCaptionPropertyId("description");
    }
}
private void addItems(final BeanItemContainer<ComboBoxItem> items) {
    comboBox.addItems(items);
}

public final void addItem(final ComboBoxItem item) {
    if (item != null) {
        comboBox.setContainerDataSource(entries);
        comboBox.addItem(item);
        comboBox.setItemCaptionPropertyId("description");
    }
}

public final void selectByIndex(final int index) {
    Object[] ids = comboBox.getItemIds().toArray();
    comboBox.select(((ComboBoxItem) ids[index]));
}

public final void selectById(final String id) {
    Object[] ids = comboBox.getItemIds().toArray();
    for (int i = 0; i < ids.length; i++) {
        if (((ComboBoxItem) ids[i]).getId().equals(id)) {
            selectByIndex(i);
            break;
        }
    }
}

public final void selectByItemText(final String description) {
    Object[] ids = comboBox.getItemIds().toArray();
    for (int i = 0; i < ids.length; i++) {
        if (((ComboBoxItem) ids[i]).getDescription().equals(description)) {
            selectByIndex(i);
            break;
        }
    }
}

public final int getItemCount() {
    return comboBox.getItemIds().toArray().length;
}

public final String getSelectedId() {
    return ((ComboBoxItem) comboBox.getValue()).getId();
}
public final String getSelectedItemText() {
    return ((ComboBoxItem) comboBox.getValue()).getDescription();
}

public final void addValueChangeListener(final ValueChangeListener listener) {
    comboBox.addValueChangeListener(listener);
}
}

及以下是测试代码

    final ComboBox combo = new ComboBox("My ComboBox");
    combo.addItem(new ComboBoxItem("all", "All"));
    // Add with list
    List<ComboBoxItem> items = new ArrayList<ComboBoxItem>();
    items.add(new ComboBoxItem("one", "One"));
    items.add(new ComboBoxItem("two", "Two"));
    items.add(new ComboBoxItem("three", "Three"));
    combo.addItems(items);

    combo.addItem(new ComboBoxItem("four", "Four"));
    combo.addItem(new ComboBoxItem("five", "five"));
    combo.selectByIndex(3);
    combo.addValueChangeListener(new ValueChangeListener() {

        public void valueChange(final ValueChangeEvent event) {
            System.out.println(combo.getSelectedId() + " --- " + combo.getSelectedItemText());

        }
    });