如何在更改数据源时使我的自定义组件更新/重新绘制?

时间:2013-08-12 12:29:08

标签: java-ee vaadin

我正在尝试在vaadin中构建一个自定义组件.componnent将在面板中有一个对象列表,我通过迭代我已经定义的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;
}   

1 个答案:

答案 0 :(得分:1)

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

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