加载UI并仅在数据准备就绪时呈现组件(网格)

时间:2017-11-08 14:14:19

标签: java vaadin vaadin8

我正在尝试加载除我的网格之外的UI,因为它花费了太多时间。我想加载我的UI,然后,当我的网格数据准备就绪时,我想要显示它。

在我的用户界面上,我有一个组合框。当用户选择它时,网格将更改并具有其他数据。目前:

  1. 用户选择组合框
  2. 我在顶部有一个进度条,用户界面没有改变
  3. 当数据提供者拥有数据时,UI更改和网格将获取新信息。
  4. 我想要的是什么:

    1. 用户选择组合框
    2. UI更改,我只能看到组合框(以及可选的空网格)
    3. 当数据提供者拥有数据时,它会填满网格。
    4. 我的代码是:

      regionSelection = new ComboBox<>(IStringConstants.REGION_COMBO_LABEL);
      regionSelection.setItems(InstanceUtil.getRegions());
      regionSelection.setSelectedItem(Regions.EU_CENTRAL_1.getName());
      regionSelection.setEmptySelectionAllowed(false);
      regionSelection.addValueChangeListener(new HasValue.ValueChangeListener() {
          private static final long serialVersionUID = -5188369735622627751L;
      
          public void valueChange(HasValue.ValueChangeEvent event) {
      refreshGrid();
          }
      });
      instanceGrid = new Grid<>();
      instanceGrid.addColumn(instance -> InstanceUtil.getTagName(instance)).setCaption(IStringConstants.TAGS_LABEL).setId(IStringConstants.TAGS_LABEL);
      instanceGrid.addColumn(Instance::getInstanceId).setCaption(IStringConstants.ID_LABEL).setId(IStringConstants.ID_LABEL);
      instanceGrid.addColumn(Instance::getInstanceType).setCaption(IStringConstants.TYPE_LABEL);
      instanceGrid.addColumn(instance -> instance.getPlacement().getAvailabilityZone()).setCaption(IStringConstants.ZONE_LABEL);
      instanceGrid.addColumn(instance -> instance.getState().getName()).setCaption(IStringConstants.STATUS_LABEL).setId(IStringConstants.STATUS_LABEL);
      instanceGrid.addColumn(Instance::getPublicIpAddress).setCaption(IStringConstants.IPV4_LABEL).setId(IStringConstants.IPV4_LABEL);
      
      instanceGrid.addColumn(Instance::getKeyName).setCaption(IStringConstants.KEY_NAME_LABEL).setId(IStringConstants.KEY_NAME_LABEL);
      instanceGrid.addComponentColumn(this::buildDeleteButton);
      ListDataProvider<Instance> dataProvider =DataProvider.ofCollection(ec2Client.getInstances());
      
      instanceGrid.setDataProvider(dataProvider);
      layout.addComponent(regionSelection);
      layout.addComponent(instanceGrid);
      

      任何提示都会受到赞赏。

      编辑,我尝试过没有成功:

      @Asynchronous
      private void async(){
          ListDataProvider<Instance> dataProvider =
                  DataProvider.ofCollection(ec2Client.getInstances());
          instanceGrid.setDataProvider(dataProvider);
      }
      
      Runnable task = () -> getUI().access(() -> {
          ListDataProvider<Instance> dataProvider =DataProvider.ofCollection(ec2Client.getInstances());
          instanceGrid.setDataProvider(dataProvider);
      });
      Executors.newSingleThreadExecutor().submit(task).isDone();
      

      我也试过了:

      ListDataProvider<Instance> dataProvider = new ListDataProvider<>(null);
      
      dataProvider = DataProvider.ofCollection(ec2Client.getInstances());
      instanceGrid.setDataProvider(dataProvider);
      

      dataProvider定义了一个成员变量

1 个答案:

答案 0 :(得分:2)

DataProvider似乎没有类似 DataReadyListener 的内容,这有助于解决我认为的问题。

但是,如果我稍微简化你的问题并忘记所有关于异步和这样的东西,并坚持只在以下“要求”。你能试试这个:

  

我想要的是什么:

     
      
  1. 用户选择组合框
  2.   
  3. UI更改,我只能看到组合框(以及可选的,   空格)
  4.   

使用空Collection<Instance>创建dataProvider。将其设置为网格DataProvider。它应该清空网格。

ArrayList<Instance> emptyList = new ArrayList<Instance>();
ListDataProvider<Instance> emptyDataProvider = new ListDataProvider<>(emptyList);
instanceGrid.setDataProvider(emptyDataProvider);

在此之后,就像现在一样。创建实际的DataProvider并将其设置为网格数据源,例如:

ListDataProvider<Instance> dataProvider =
        DataProvider.ofCollection(ec2Client.getInstances());
instanceGrid.setDataProvider(dataProvider);
  
      
  1. 当数据提供者拥有数据时,它会填充网格
  2.   

希望它能做到这一点。但即使它没有等到数据就绪,网格中也不会有任何旧数据。

这无助于摆脱我认为的进度条。但不确定它是否是一个好主意。

如果某些默认数据需要,也可以应用于初始页面加载,或者Collection<Instance> DataProvider最初只能为空,只有在明确选择组合时才会加载。

相关问题