0

vaadin でカスタム コンポーネントを構築しようとしています。コンポーネントにはパネル内のオブジェクトのリストがあり、定義した BeanItemContainer を反復処理して手動で取得します。基本的には正常に動作します。クリックするたびにリストに新しい要素を追加する追加ボタン。追加ボタンをクリックすると、いくつかのフィールドと保存ボタンを含むウィンドウがポップアップします。ウィンドウの保存ボタンをクリックすると、新しいアイテムがデータベースに保存されます。これで、新しいアイテムを作成してコンテナーに保存できます。ただし、UI (リスト) を更新または更新して、新しいオブジェクトがlist.再描画リスナーを追加するか、リスト パネルなどを常に再描画するスレッドを作成する必要がありますか?どうすればよいですか?提案やヒントをありがとうございます。以下は、メイン コンポジットとリストを定義するコードです。

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

チュートリアルの Addressbook アプリケーションをご覧ください。テーブルとデータ ソース コンテナーがあります。「新規」ボタンが押されると、新しいエントリがデータ ソース コンテナに追加され、自動的に ItemSetChangeEvent がテーブルに伝達されます。最後に、新しいエントリがテーブルに表示されます

同じアプローチを使用できます。カスタム コンポーネントに Container.ItemSetChangeListener を実装します。メソッドbuildPanelで、コンポーネントをコンテナー リスナーとして登録します (リスナー登録の例については、AbstractSelect.setContainerDataSource を参照してください)。

于 2013-08-12T20:59:02.493 に答える