【问题标题】:How to make my customcomponent update/repaint when its data source is changed?更改数据源时如何使我的自定义组件更新/重绘?
【发布时间】:2013-08-12 12:29:07
【问题描述】:

我正在尝试在 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;
}   

【问题讨论】:

    标签: jakarta-ee vaadin


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢回复。我设法用一种简单的方法解决了它,我只是在点击侦听器中再次重新初始化面板以从容器中获取新数据并重新初始化 UI。代码如下: save=new Button("Save"); save.addListener(new ClickListener(){panel=buildPanel();mainLayout.addComponent(label);mainLayout.addComponent(panel);});
    • 这是一个相当丑陋的解决方案。 ChangeListener 是解决问题的正确方法。
    • @user2365727 谢谢你的好建议。对不起,我之前在教程中阅读过联系人列表示例。那是更简单的情况。并且只使用了值变化监听器。我可以理解那个例子。但是我不太明白你推断的接口何时实现,组件中真正添加了什么。例如,如果我实现 ItemsetListener 将听什么界面?你有任何示例代码吗? abstractSelect.setContainerDataSource. 如果我只是向容器添加一个侦听器并且当它的项集发生更改时,UI 会重新绘制是否更容易?
    • @RenatGilmanov 我完全同意。但问题是我不太了解作为接口实现的更复杂的侦听器。你有一些好的示例代码吗?
    猜你喜欢
    • 2016-07-06
    • 1970-01-01
    • 1970-01-01
    • 2011-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-04
    相关资源
    最近更新 更多