我单击一个按钮后需要更新ListSelect的列表,但我不知道如何

这是我的代码:

创建列表方法

private void createListPanel() {
        VerticalLayout listPanel = new VerticalLayout();
        listPanel.setWidth(100f, Unit.PERCENTAGE);

        queryList= new ListSelect("List Of Querys", getQueryList());
        queryList.setWidth(100f, Unit.PERCENTAGE);

        queryList.setNullSelectionAllowed(false);

        queryList.addValueChangeListener(event -> {

            selectedQuery = (String) (queryList.getValue());
            String retrievedQuery = repository.getRawQuery(selectedQuery);

        });

        listPanel.addComponent(queryList);
        panelSuperior.addComponent(listPanel);
    }


getQueryList()

private List<String> getQueryList() {
    return repository.getQueryNames();
}


创建按钮方法

private void CreateButton() {
    Button buttonRefresh= new Button("Refresh");

    buttonRefresh.addClickListener((Button.ClickEvent e) -> {
        // i tried this
        queryList.setContainerDataSource((Container) getQueryList());
    });

    buttonPanel.addComponent(button);

}


我在CreateButton()方法中尝试了这一行:

queryList.setContainerDataSource((Container) getQueryList())


但我得到一个

java.lang.ClassCastException: java.util.ArrayList cannot be cast to com.vaadin.data.Container


因为此方法需要一个Container对象

我在Vaadin javadoc中搜索,但是找不到设置或更新ListSelect列表的方法。

Vaadin Javadoc:Vaadin Javadoc 7.7.9 ListSelect

提前致谢

最佳答案

直接的方法是从基础容器中删除所有项目,然后再添加新项目:

Container container = queryList.getContainerDataSource();
container.removAllItems();
List<String> queries = getQueryList();
for(String query : queries) {
    container.addItem(query);
}


ListSelect(String caption, Collection<?> options)构造函数创建一个IndexedContainer并使用您集合中的项目填充它。

另一个选择是将ListSelect绑定到容器,这可能使它能够自动跟踪更改。有关更多信息,请参见Vaadin文档中的"Collecting Items in Containers"主题。

09-27 12:08