【问题标题】:how to retrieve the newly added item to vaadin combobox with a button click如何通过单击按钮将新添加的项目检索到 vaadin 组合框
【发布时间】:2016-09-12 07:38:03
【问题描述】:

我的问题很简单。我正在尝试通过单击按钮将新项目添加到已经填充了一些数据的 Vaadin ComboBox。我希望新添加的项目在按钮单击事件处理程序中可用,以便我可以将其添加到数据库表中。

ComboBox region = new ComboBox();
for (RegionDetails details : regions) {
    int regionId = details.getRegionId();
    String regionName = details.getRegionName();
    region.addItem(regionId);
    region.setItemCaption(regionId, regionName);
}

Button addR = new Button("Add");
addR.addClickListener(new ClickListener() {
    @Override
    public void buttonClick(ClickEvent event) {
        // how do I reference the item here?!
    }
});

我试了很多次,但没有得到线索。

有人请帮助我。提前致谢。

【问题讨论】:

  • 你能贴出你代码的相关部分吗?
  • ComboBox region = new ComboBox(); for (RegionDetails details : regions) { int regionId = details.getRegionId(); String regionName= details.getRegionName(); region.addItem(regionId); region.setItemCaption(regionId, regionName); } Button addR = new Button("Add"); addR.addClickListener(new ClickListener() { @Override public void buttonClick(ClickEvent event) { } }); 我正在尝试通过单击“addR”按钮并在按钮单击事件处理程序中打印输入的值来向组合框“区域”添加一个新值。

标签: button combobox vaadin


【解决方案1】:

如果您还没有这样做,您应该查看 Vaadin 书籍/文档中的 collecting items in containers 章节。它使您的生活更轻松,因为 Vaadin 将自动完成大部分工作,因此您不必手动定义标题、字段等。可能存在不适合但很少且不在问题范围内的情况讨论它们。

您可以在下面看到基于您之前的代码和一些虚拟数据的示例。我所做的是使用 BeanItemContainer 来收集组合的项目数据,并使用它们的 name 属性使 Vaadin 生成标题,而不必手动设置它。此外,在 click-listener 中,您只需将 bean 添加到容器中,然后将其保存到 DB 或您需要做的任何事情:

public class MyComboBoxComponent extends VerticalLayout {

    // bean property to use for caption generation
    private static final String CAPTION_PROPERTY = "name";

    public MyComboWithItemIDComponent() {
        // basic combo instantiation
        ComboBox comboBox = new ComboBox();

        // use a bean item container
        BeanItemContainer<RegionDetails> itemContainer = new BeanItemContainer<>(RegionDetails.class);
        comboBox.setContainerDataSource(itemContainer);

        // configure the combo to use the "name" property of each item as their caption
        // so we don't need to manually set it... magic
        comboBox.setItemCaptionMode(AbstractSelect.ItemCaptionMode.PROPERTY);
        comboBox.setItemCaptionPropertyId(CAPTION_PROPERTY);

        // add some dummy data
        itemContainer.addAll(generateSomeDummyDetails());

        // add button
        Button addButton = new Button("Add", event -> {
            // create a new bean instance and populate it accordingly
            RegionDetails newRegionDetails = new RegionDetails(itemContainer.size(), "Region - " + itemContainer.size());

            // add it to the container
            itemContainer.addItem(newRegionDetails);

            // do whatever you want with the newRegionDetails here
        });

        // add the components to the layout
        addComponent(comboBox);
        addComponent(addButton);
    }

    // method to generate some dummy data
    private List<RegionDetails> generateSomeDummyDetails() {
        List<RegionDetails> dummyDetails = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            dummyDetails.add(new RegionDetails(i, "Region - " + i));
        }
        return dummyDetails;
    }

    // the model bean
    public class RegionDetails {

        private final int id;
        private final String name;

        public RegionDetails(int id, String name) {
            this.id = id;
            this.name = name;
        }

        public int getId() {
            return id;
        }

        public String getName() {
            return name;
        }
    }
}

结果:

【讨论】:

  • 这里您通过硬编码值来创建一个 bean 实例。我的要求是根据用户在 ComboBox 中输入的值创建 bean 实例。
  • @Debasish 在这种情况下,您应该使用此信息以及您在点击侦听器中尝试执行的操作来更新问题。很可能您可以使用comboBox.getValue() 获取所选项目,但除非我们从您那里获得所有信息,否则我们只能猜测您要做什么......
  • 很抱歉没有提供详细信息并造成混乱。其实我对 StackOverflow 也很陌生。正如您所建议的那样,comboBox.getValue() 可以用于获取所选项目。正如我们所知,我们可以通过简单地编辑而不是从下拉列表中选择一个项目来向 ComboBox 添加一个新项目 (regionName)。所以我希望 ComboBox 中新输入的“regionName”在点击监听器中可用,这样我就可以将新输入的值传递给服务调用。
  • @Morfic。 OT:你是如何制作那些漂亮的“幻灯片”的?
  • 当我从键盘上单击 Enter 键时,我会在comboBox.setNewItemHandler() 中获得新输入的项目。有什么办法可以从按钮点击监听器内部触发setNewItemHandler()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多