5

Vaadin 7.0 で、BeanContainerを使用してテーブルにJavaBeanデータを表示する場合、新しいデータでテーブルを更新する適切な方法は何ですか?

4

3 に答える 3

9

テーブルは、リスナーを介してテーブルのアイテムのプロパティを監視します。テーブルの Item インスタンスを介してアイテムのプロパティを変更すると、テーブルに通知されて更新されます。

container.getItem(beanInstance).getItemProperty("propertyName").setValue("newValue");

ただし、項目インスタンスの外でBean が変更された場合は、テーブルを更新するように指示する必要があります。最も簡単な方法 (ストック BeanContainer を使用) は、単純に項目を削除してから追加することです。

別の方法として、可能であれば、テーブルを更新する ItemSetChange イベントを発生させる BeanItemContainer の拡張機能を作成することもできます。

public class RefreshableBeanItemContainer<BEANTYPE> extends BeanItemContainer<BEANTYPE> {
  public RefreshableBeanItemContainer(Collection<? extends BEANTYPE> collection) throws IllegalArgumentException {
    super(collection);
  }

  public RefreshableBeanItemContainer(Class<? super BEANTYPE> type) throws IllegalArgumentException {
    super(type);
  }

  public RefreshableBeanItemContainer(Class<? super BEANTYPE> type, Collection<? extends BEANTYPE> collection) throws IllegalArgumentException {
    super(type, collection);
  }

  public void refreshItems(){
    fireItemSetChange();
  }
}
于 2013-04-22T07:21:27.357 に答える
2

JavaBean データを更新する 1 つの方法は、テーブルのコンテナを別のコンテナに置き換えることです。私が気づいた副作用の 1 つは、折りたたまれた列が折りたたまれなくなるなど、テーブルの設定の一部がリセットされる可能性があることです。

別の方法は、含まれている Bean を置き換えながらコンテナを保持しているようです。

これらのアプローチの両方が適切と見なされるかどうかはわかりません。そして、これらのアプローチのいずれかのトレードオフが何であるかはわかりません。

これは、テーブルのペアとボタンを備えたアプリの例です。ユーザーがボタンをクリックすると、両方のテーブルが新しいデータを取得します。1 つのテーブルが新しい BeanContainer を取得します。もう一方のテーブルはその BeanContainer を保持しますが、新しい Bean がロードされます。

テーブルのペアとそれらの間にボタンがある Vaadin 7.0.4 アプリのスクリーン ショット。

このアプリでは 2 つのクラスのみ:

  • アプリのメイン クラス。
  • データの格納に使用される JavaBean クラス。
package com.example.replacebeansorcontainer;

import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

import com.vaadin.data.util.BeanContainer;
import com.vaadin.server.VaadinRequest;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Table;
import com.vaadin.ui.UI;

/**
 * Main UI class.
 * 
 * ReplaceBeansOrContainerUI.java
 * 
 * @author Basil Bourque
 * 
 *         Copyright © 2013 Basil Bourque. This source code may be used freely forever by anyone taking full responsibility for doing so.
 * 
 */
@SuppressWarnings( "serial" )
public class ReplaceBeansOrContainerUI extends UI {
    Table tableThatGetsFreshContainer;
    Table tableThatGetsFreshBeans;

    @Override
    protected void init( VaadinRequest request ) {
        // Create widgets: table on the left, button, table on the right.

        this.tableThatGetsFreshContainer = new Table( "Table That Gets Fresh Container", this.makeBeanContainer() );
        this.tweakTable( this.tableThatGetsFreshContainer );

        this.tableThatGetsFreshBeans = new Table( "Table That Gets Fresh Beans", this.makeBeanContainer() );
        this.tweakTable( this.tableThatGetsFreshBeans );

        Button reloadButton = new Button( "Reload Data" );
        reloadButton.addClickListener( new Button.ClickListener() {
            @Override
            public void buttonClick( ClickEvent event ) {
                // Reload data in both tables when user clicks this button.
                System.out.println( "User clicked 'Reload Data' button. Replacing container (left) & beans (right)." + new java.util.Date() );
                // One table gets a new Container.
                ReplaceBeansOrContainerUI.this.tableThatGetsFreshContainer.setContainerDataSource( ReplaceBeansOrContainerUI.this.makeBeanContainer() );
                // The other table keeps its Container, but the Container's beans are replaced.
                ReplaceBeansOrContainerUI.this.tableThatGetsFreshBeans.getContainerDataSource().removeAllItems();
                // Cast the Container to BeanContainer to utilize the 'addAll' method.
                @SuppressWarnings( "unchecked" )
                BeanContainer<UUID, MomentBean> beanContainer = (BeanContainer<UUID, MomentBean>)ReplaceBeansOrContainerUI.this.tableThatGetsFreshBeans.getContainerDataSource();
                beanContainer.addAll( ReplaceBeansOrContainerUI.this.makeListOfBeans() );
            }
        } );

        // Compose Layout.
        final HorizontalLayout layout = new HorizontalLayout();
        layout.setMargin( true );
        layout.setSpacing( true );
        layout.addComponent( this.tableThatGetsFreshContainer ); // Table on the left.
        layout.addComponent( reloadButton );
        layout.addComponent( this.tableThatGetsFreshBeans ); // Table on the right.

        // Compose UI.
        this.setContent( layout );
    }

    private void tweakTable( Table table ) {
        table.setSelectable( true );
    }

    private List<MomentBean> makeListOfBeans() {
        List<MomentBean> beans = new ArrayList<MomentBean>();
        for ( int i = 0; i < 20; i++ ) {
            beans.add( new MomentBean() );
        }
        return beans;
    }

    private BeanContainer<UUID, MomentBean> makeBeanContainer() {
        // Instantiate empty container, with columns defined by my class’ JavaBean fields.
        BeanContainer<UUID, MomentBean> container = new BeanContainer<UUID, MomentBean>( MomentBean.class );
        try {
            // Indicate which field in Bean serves as the unique identifier.
            container.setBeanIdProperty( MomentBean.class.getDeclaredField( "uuid" ).getName() );
            container.addAll( this.makeListOfBeans() ); // Add entire Collection of beans to container.
        } catch ( NoSuchFieldException e ) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch ( SecurityException e ) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return container;
    }
}

JavaBean クラス…</p>

/**
 * 
 */
package com.example.replacebeansorcontainer;

import java.text.SimpleDateFormat;
import java.util.UUID;

/**
 * MomentBean.java
 * 
 * @author Basil Bourque
 * 
 *         Copyright © 2013 Basil Bourque. This source code may be used freely forever by anyone taking full responsibility for doing so.
 * 
 */
public class MomentBean {
    // Bean fields.
    private final String clockTime;
    private final long nanoTime;
    private final UUID uuid;

    // Other member fields.
    private final SimpleDateFormat timeOnlyFormat = new SimpleDateFormat( "HH:mm:ss" );

    /**
     * 
     */
    public MomentBean() {
        this.clockTime = this.timeOnlyFormat.format( new java.util.Date() );
        this.nanoTime = System.nanoTime();
        this.uuid = UUID.randomUUID();
    }

    /**
     * @return the clockTime
     */
    public String getClockTime() {
        return this.clockTime;
    }

    /**
     * @return the nanoTime
     */
    public long getNanoTime() {
        return this.nanoTime;
    }

    /**
     * @return the uuid
     */
    public UUID getUuid() {
        return this.uuid;
    }

}
于 2013-04-20T00:56:11.127 に答える