在Vaadin 7.4应用程序中使用一组新的数据更新网格 [英] Update Grid with a fresh set of data, in Vaadin 7.4 app

查看:93
本文介绍了在Vaadin 7.4应用程序中使用一组新的数据更新网格的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在新的 Grid 小部件首次出现,以替代古老的显示网格后,我稍后想用新数据替换整个数据集.我不想更新单个行,而是要简单地替换它们.

After getting a Grid displayed, I later want to replace the entire set of data with fresh data. Rather than update the individual rows, I want to simply replace them.

我碰巧使用了 BeanItemContainer 使用JavaBeans风格的getter方法,可以轻松地以只读方式显示某些对象.

I happen to be using a BeanItemContainer for easy read-only display of some objects with JavaBeans-style getter methods.

推荐答案

我考虑了两种方法:

  • 替换豆项目的两步过程.
    • Two step process of replacing bean items.
      • (1) First remove all BeanItem objects with Container::removeAllItems method.
      • (2) Then add replacement BeanItem objects with the BeanItemContainer::addAll method.
      • 致电 ,并传递使用新数据构造的BeanItemContainer的新实例.
      • Call Grid::setContainerDataSource and pass a new instance of BeanItemContainer constructed with fresh data.

      下面是显示两种方法的示例应用程序(Vaadin 7.4.2).出现一对相同的Grid小部件.每个按钮都有一个按钮,可以通过两种方法更新数据.

      Below is a sample application (Vaadin 7.4.2) showing both approaches. A pair of identical Grid widgets appear. Each has a button that updates data with either approach.

      第一种方法(删除项目和添加项目)有效.新数据立即出现.

      The first approach (removing items and adding items) works. The fresh data immediately appears.

      第二种方法(代替容器而不是项目)似乎应该可行,在票号17268 .

      The second approach (replacing container rather than items) seems like it should work, with nothing contrary suggested in the scant documentation. But nothing happens. No exceptions or errors occur, yet no fresh data appears. I opened Ticket # 17268 on Vaadin trac for this issue.

      也许还有其他更好的方法.请张贴或发表评论.

      Perhaps there are other better ways. Please post or comment with any alternatives.

      下面显示了三个类.您应该能够将粘贴复制粘贴到新的Vaadin 7.4.x应用程序中.

      Three classes are displayed below. You should be able to copy-paste into a new Vaadin 7.4.x app.

      • 一个类是在每个新的Vaadin应用中创建的常规"MyUI".
      • 另一个是简单的JavaBeans风格的类天文学家",它为Grid中的行提供数据.该天文学家类包括一个方便的生成实例列表的静态方法.每个新的天文学家都会获得随机数的人气投票,以显示新的数据值.
      • 该示例的主要内容是在"AstronomersLayout"类中,该类使用分配的按钮创建一对网格.

      我使用Java 8 Lambda语法和新的java.time类.因此,您可能需要更改项目的设置以使用Java8.在NetBeans 8中,这表示Project > Properties > Sources > Source/Binary Format (popup menu) > 1.8.

      I use Java 8 Lambda syntax and the new java.time classes. So you may need to change your project's settings to use Java 8. In NetBeans 8 that means Project > Properties > Sources > Source/Binary Format (popup menu) > 1.8.

      启动您的Vaadin应用.

      Get your Vaadin app going.

      package com.example.vaadingridexample;
      
      import javax.servlet.annotation.WebServlet;
      
      import com.vaadin.annotations.Theme;
      import com.vaadin.annotations.VaadinServletConfiguration;
      import com.vaadin.annotations.Widgetset;
      import com.vaadin.server.VaadinRequest;
      import com.vaadin.server.VaadinServlet;
      import com.vaadin.ui.UI;
      
      /**
       * Example app in Vaadin 7.4.2 experimenting with two ways to replace data in a
       * displayed Grid.
       *
       * @author Basil Bourque
       */
      @Theme ( "mytheme" )
      @Widgetset ( "com.example.vaadingridexample.MyAppWidgetset" )
      public class MyUI extends UI
      {
      
          @Override
          protected void init ( VaadinRequest vaadinRequest )
          {
              this.setContent( new AstronomersLayout() );
          }
      
          @WebServlet ( urlPatterns = "/*" , name = "MyUIServlet" , asyncSupported = true )
          @VaadinServletConfiguration ( ui = MyUI.class , productionMode = false )
          public static class MyUIServlet extends VaadinServlet
          {
          }
      
      }
      

      AstronomersLayout.java

      示例的主要部分.

      AstronomersLayout.java

      The main part of the example.

      package com.example.vaadingridexample;
      
      import com.vaadin.data.util.BeanItemContainer;
      import com.vaadin.shared.ui.grid.HeightMode;
      import com.vaadin.ui.Button;
      import com.vaadin.ui.Button.ClickEvent;
      import com.vaadin.ui.Grid;
      import com.vaadin.ui.VerticalLayout;
      import java.time.ZoneOffset;
      import java.time.ZonedDateTime;
      import java.time.format.DateTimeFormatter;
      import java.util.List;
      
      /**
       * Layout displays a pair of Grids, each with a Button to replace its contents
       * with fresh data in either of two ways: (a) Replace all the items within the
       * Container, or (b) Replace container itself.
       *
       * @author Basil Bourque
       */
      @SuppressWarnings ( "serial" )
      public class AstronomersLayout extends VerticalLayout
      {
      
          // -----|  Member vars  |--------------------------
          Grid grid_ReplaceItems;
          String gridCaption_ReplaceItems = "Astronomers - Replacing Items";
          Button button_ReplaceItems;
      
          Grid grid_ReplaceContainer;
          String gridCaption_ReplaceContainer = "Astronomers - Replacing Container";
          Button button_ReplaceContainer;
      
          // -----|  Constructor  |--------------------------
          public AstronomersLayout ()
          {
              this.prepareWidgets();
              this.composeLayout();
          }
      
          // -----|  Helper Methods  |--------------------------
          private void prepareWidgets ()
          {
              // Show updating a Grid by replacing the bean items within a container.
              // Grid
              List<Astronomer> listA = Astronomer.makeList();
              BeanItemContainer<Astronomer> containerA = new BeanItemContainer<>( Astronomer.class , listA );
              this.grid_ReplaceItems = new Grid( this.gridCaption_ReplaceItems , containerA );
              //this.grid_ReplaceItems.setColumnOrder( "votes" , "givenName" , "surName" , "birthYear" );
              this.grid_ReplaceItems.setColumnOrder( Astronomer.FIELD.VOTES.getName() , Astronomer.FIELD.GIVENNAME.getName() , Astronomer.FIELD.SURNAME.getName() , Astronomer.FIELD.BIRTHYEAR.getName() );  // Enum is a safer way of doing this: this.grid_ReplaceItems.setColumnOrder( "votes" , "givenName" , "surName" , "birthYear" );
              this.grid_ReplaceItems.setHeightMode( HeightMode.ROW ); // Show all rows of data for this grid.
              this.updateCaptionAndSize( this.grid_ReplaceItems , this.gridCaption_ReplaceItems );
              // Button
              this.button_ReplaceItems = new Button( "Replace Items" );
              this.button_ReplaceItems.addClickListener( ( ClickEvent event ) -> {
                  @SuppressWarnings ( "unchecked" )
                  BeanItemContainer<Astronomer> bic = ( BeanItemContainer<Astronomer> ) this.grid_ReplaceItems.getContainerDataSource(); // Access existing container. Cast as need be.
                  bic.removeAllItems();  // Remove existing items.
                  bic.addAll( Astronomer.makeList() ); // Add fresh bean items to existing container.
                  this.updateCaptionAndSize( this.grid_ReplaceItems , this.gridCaption_ReplaceItems );
              } );
      
              // Show updating a Grid by replacing the container rather than its contents.
              // Grid
              List<Astronomer> listB = Astronomer.makeList();
              BeanItemContainer<Astronomer> containerB = new BeanItemContainer<>( Astronomer.class , listB );
              this.grid_ReplaceContainer = new Grid( this.gridCaption_ReplaceContainer , containerB );
              this.grid_ReplaceContainer.setColumnOrder( Astronomer.FIELD.VOTES.getName() , Astronomer.FIELD.GIVENNAME.getName() , Astronomer.FIELD.SURNAME.getName() , Astronomer.FIELD.BIRTHYEAR.getName() );
              this.grid_ReplaceContainer.setHeightMode( HeightMode.ROW ); // Show all rows of data for this grid.
              this.updateCaptionAndSize( this.grid_ReplaceContainer , this.gridCaption_ReplaceContainer );
              // Button
              this.button_ReplaceContainer = new Button( "Replace Container" );
              this.button_ReplaceContainer.addClickListener( ( ClickEvent event ) -> {
                  @SuppressWarnings ( "unchecked" )
                  BeanItemContainer<Astronomer> bic = new BeanItemContainer<>( Astronomer.class , listB ); // Create replacement container.
                  this.grid_ReplaceContainer.setContainerDataSource( bic );
                  this.updateCaptionAndSize( this.grid_ReplaceContainer , this.gridCaption_ReplaceContainer );
              } );
          }
      
          private void updateCaptionAndSize ( final Grid grid , final String caption )
          {
              // Caption
              grid.setCaption( caption + " ( updated " + this.now() + " )" );  // Update caption of Grid to indicate fresh data.
              // Show all rows.
              double h = grid.getContainerDataSource().size() > 0 ? grid.getContainerDataSource().size() : 3; // Cannot set height to zero rows. So if no data, set height to some arbitrary number of (empty) rows.
              grid.setHeightByRows( h );
          }
      
          private void composeLayout ()
          {
              // Initialize this layout.
              this.setMargin( true );
              this.setSpacing( true );
      
              // Content
              this.addComponent( this.button_ReplaceItems );
              this.addComponent( this.grid_ReplaceItems );
      
              this.addComponent( this.button_ReplaceContainer );
              this.addComponent( this.grid_ReplaceContainer );
          }
      
          // Helper method.
          private String now ()
          {
              // Get current time in UTC. Truncate fractional seconds. Append a 'Z' to indicate UTC time zone.
              return ZonedDateTime.now( ZoneOffset.UTC ).format( DateTimeFormatter.ISO_LOCAL_TIME ).substring( 0 , 8 ).concat( "Z" );
          }
      
      }
      

      Astronomer.java

      存储在BeanItemContainer中的数据(即bean项目),用于在网格中显示.

      Astronomer.java

      The data, the bean items, stored in a BeanItemContainer for display in a Grid.

      嵌套的Enum提供了一种更安全的方式来引用另一个类AstronomersLayout中的字段名称,以调用setColumnOrder.

      A nested Enum provides a safer way to refer to the field names in the other class, AstronomersLayout for call to setColumnOrder.

      package com.example.vaadingridexample;
      
      import java.util.ArrayList;
      import java.util.List;
      
      /**
       * Provides the beans to appear as rows in a BeanItemContainer backing a Grid.
       *
       * Note the static convenience method for generating a List of instances.
       *
       * @author Basil Bourque
       */
      public class Astronomer
      {
      
          public enum FIELD
          {
      
              SURNAME( "surname" ),
              GIVENNAME( "givenName" ),
              BIRTHYEAR( "birthYear" ),
              VOTES( "votes" );
      
              private String name;
      
              private FIELD ( String s )
              {
                  this.name = s;
              }
      
              public String getName ()
              {
                  return this.name;
              }
          }
      
          // Members
          private String surname;
          private String givenName;
          private Integer birthYear;
          private Integer votes;
      
          public Astronomer ( final String givenName , final String surName , final Integer birthYear )
          {
              this.surname = surName;
              this.givenName = givenName;
              this.birthYear = birthYear;
              this.votes = this.random();
          }
      
          public static List<Astronomer> makeList ()
          {
              List<Astronomer> list = new ArrayList<>( 7 );
      
              list.add( new Astronomer( "Hypatia" , "of Alexandria" , -370 ) );
              list.add( new Astronomer( "Nicolaus" , "Copernicus" , 1473 ) );
              list.add( new Astronomer( "Tycho" , "Brahe" , 1546 ) );
              list.add( new Astronomer( "Giordano" , "Bruno" , 1548 ) );
              list.add( new Astronomer( "Galileo" , "Galilei" , 1564 ) );
              list.add( new Astronomer( "Johannes" , "Kepler" , 1571 ) );
              list.add( new Astronomer( "Isaac" , "Newton" , 1643 ) );
              list.add( new Astronomer( "Caroline" , "Herschel" , 1750 ) );
      
              return list;
          }
      
          // ----|  Helper Methods  |----------------------------------
          private Integer random ()
          {
              return ( int ) ( java.lang.Math.random() * 100 );
          }
      
          // ----|  Bean Getters  |----------------------------------
          public String getSurname ()
          {
              return this.surname;
          }
      
          public String getGivenName ()
          {
              return this.givenName;
          }
      
          public Integer getBirthYear ()
          {
              return this.birthYear;
          }
      
          public Integer getVotes ()
          {
              return this.votes;
          }
      
          // ----|  Object Superclass  |----------------------------------
          @Override
          public String toString ()
          {
              return "Astronomer{ " + "surName=" + surname + " | givenName=" + givenName + " | birthYear=" + birthYear + " | votes=" + votes + " }";
          }
      
      }
      

      这篇关于在Vaadin 7.4应用程序中使用一组新的数据更新网格的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆