0

我正在尝试在 vaadin 中构建一个自定义组件。组件将在面板中有一个对象列表,我通过迭代我定义的 BeanItemContainer 手动获取它们。它基本上工作正常。但现在我想要一个添加按钮,每次单击它都会在列表中添加一个新元素。单击添加按钮时,将弹出一个包含一些字段和保存按钮的窗口。如果您单击窗口中的保存按钮,则新项目将被保存到数据库中。现在我可以创建一个新项目并将其保存到容器中。但是,我不知道如何更新或刷新 UI(列表),以便我的新对象将显示在列表。我应该添加一个重绘侦听器还是创建一个始终重绘列表面板或其他内容的线程?我该怎么做?感谢您的任何建议或提示。非常感谢您的帮助。以下是定义主组合和列表的代码。

public adminComposite(String listType,String objectType,Container source) {
    this.container=source;
    mainLayout = new VerticalLayout();
    panel = buildPanel(source);
    label =new Label(listType);
    mainLayout.addComponent(label);
    mainLayout.addComponent(panel);
    setCompositionRoot(mainLayout);


}


private Panel buildPanel(Container c) {
    Panel bpanel = new Panel();
    bpanel.setHeight("400px");
    // verticalLayout_1
    panelLayout = (VerticalLayout)bpanel.getContent();
    //iterate the container to fetch all Items
    for(Iterator i=c.getItemIds().iterator();i.hasNext();){
        //get current Item id,then get a item
        Object id = i.next();
        Item it =c.getItem(id);
        // get data out of the item and fill them into the horizontalLayout
        String caption =(String)(it.getItemProperty("caption").getValue());
        String shortmsg = (String)(it.getItemProperty("sms").getValue());
        Date time = (Date)(it.getItemProperty("timestamp").getValue());
        int uid = (Integer)(it.getItemProperty("uid").getValue());
        HorizontalLayout newline = buildHorizontalLayout(uid,caption,shortmsg,time);
        newline.setSizeFull();
        panelLayout.addComponent(newline);
    }
    add = new Button("Add New");
    add.setDescription("Add a new object in the list and database");

    bpanel.addComponent(add);
    panelLayout.setSpacing(true);
    panelLayout.setMargin(true);
    return bpanel;
}   
4

1 回答 1

1

请查看教程地址簿应用程序。有一个表和数据源容器。当按下“新建”按钮时,新条目被添加到数据源容器中,并且自动将 ItemSetChangeEvent 传播到表中。最后,新条目显示在表格上

您可以使用相同的方法。在您的自定义组件中实现 Container.ItemSetChangeListener。在buildPanel方法中将您的组件注册为容器侦听器(有关侦听器注册示例,请参见 AbstractSelect.setContainerDataSource)

于 2013-08-12T20:59:02.493 回答