Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 加载UI并仅在数据准备就绪时呈现组件(网格)_Java_Vaadin_Vaadin8 - Fatal编程技术网

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

Java 加载UI并仅在数据准备就绪时呈现组件(网格),java,vaadin,vaadin8,Java,Vaadin,Vaadin8,我正在尝试加载除网格之外的UI,因为它占用了太多时间。我想加载我的UI,然后,当我的网格数据准备好时,我想显示它 在我的UI上,我有一个组合框。当用户选择它时,网格将发生变化并有其他数据。目前: 用户选择组合框 我在顶部有一个进度条,用户界面没有改变 当dataprovider拥有数据时,UI将更改,网格将获取新信息 我想要的是: 用户选择组合框 在UI更改时,我只能看到组合框(以及可选的空网格) 当数据提供者拥有数据时,它将填充网格 我的代码是: regionSelection = new C

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

在我的UI上,我有一个组合框。当用户选择它时,网格将发生变化并有其他数据。目前:

  • 用户选择组合框
  • 我在顶部有一个进度条,用户界面没有改变
  • 当dataprovider拥有数据时,UI将更改,网格将获取新信息 我想要的是:

  • 用户选择组合框
  • 在UI更改时,我只能看到组合框(以及可选的空网格)
  • 当数据提供者拥有数据时,它将填充网格 我的代码是:

    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);
    
    regionSelection=新组合框(IStringConstants.REGION\u组合标签);
    regionSelection.setItems(InstanceUtil.getRegions());
    regionSelection.setSelectedItem(Regions.EU_CENTRAL_1.getName());
    regionSelection.setEmptySelectionAllowed(false);
    regionSelection.addValueChangeListener(新的HasValue.ValueChangeListener(){
    私有静态最终长serialVersionUID=-5188369735622627751L;
    public void valueChange(HasValue.valuechangevent事件){
    刷新网格();
    }
    });
    instanceGrid=新网格();
    instanceGrid.addColumn(instance->InstanceUtil.getTagName(instance)).setCaption(IStringConstants.TAGS\u LABEL).setId(IStringConstants.TAGS\u LABEL);
    instanceGrid.addColumn(实例::getInstanceId).setCaption(IStringConstants.ID\u标签).setId(IStringConstants.ID\u标签);
    instanceGrid.addColumn(实例::getInstanceType).setCaption(IStringConstants.TYPE_标签);
    instanceGrid.addColumn(实例->实例.getPlacement().getAvailabilityZone()).setCaption(IStringConstants.ZONE_标签);
    instanceGrid.addColumn(instance->instance.getState().getName()).setCaption(IStringConstants.STATUS\u标签).setId(IStringConstants.STATUS\u标签);
    instanceGrid.addColumn(实例::getPublicIpAddress).setCaption(IStringConstants.IPV4\u标签).setId(IStringConstants.IPV4\u标签);
    instanceGrid.addColumn(实例::getKeyName).setCaption(IStringConstants.KEY\u NAME\u LABEL).setId(IStringConstants.KEY\u NAME\u LABEL);
    instanceGrid.addComponentColumn(此::buildDeleteButton);
    ListDataProvider dataProvider=dataProvider.ofCollection(ec2Client.getInstances());
    instanceGrid.setDataProvider(dataProvider);
    布局。添加组件(区域选择);
    layout.addComponent(instanceGrid);
    
    任何暗示都将不胜感激


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

    @Asynchronous
    private void async(){
        ListDataProvider<Instance> dataProvider =
                DataProvider.ofCollection(ec2Client.getInstances());
        instanceGrid.setDataProvider(dataProvider);
    }
    
    异步的 私有void async(){ ListDataProvider数据提供程序= DataProvider.ofCollection(ec2Client.getInstances()); instanceGrid.setDataProvider(dataProvider); }
    Runnable task=()->getUI().access(()->{
    ListDataProvider 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);
    
    ListDataProvider-dataProvider=新的ListDataProvider(空);
    dataProvider=dataProvider.ofCollection(ec2Client.getInstances());
    instanceGrid.setDataProvider(dataProvider);
    

    dataProvider定义了一个成员变量

    dataProvider
    似乎没有类似DataReadyListener的东西,我认为这有助于解决这个问题

    但是如果我把你的问题简化一点,忘掉异步之类的东西,只坚持下面的“要求”。你能试试这个吗

    我想要的是:

  • 用户选择组合框
  • 在UI更改时,我只能看到组合框(以及可选的 空网格)
  • 使用空的
    集合创建数据提供程序。将其设置为网格
    DataProvider
    。它应该清空网格

    ArrayList<Instance> emptyList = new ArrayList<Instance>();
    ListDataProvider<Instance> emptyDataProvider = new ListDataProvider<>(emptyList);
    instanceGrid.setDataProvider(emptyDataProvider);
    
  • 当数据提供者拥有数据时,它将填充网格
  • 希望它能做到这一点。但是网格中不会有任何旧数据,即使它没有等到数据准备就绪

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


    如果某些默认数据需要,这也可以应用于初始页面加载,或者
    数据提供程序的
    集合
    最初可以为空,只有在明确选择组合时才会触发加载。

    您好,感谢您的帮助。“在那之后,像你现在这样做”在哪里?我不太明白。。。我很抱歉。我试过了,但我肯定我误解了你说的话。我用我尝试过的内容编辑我的帖子。@Bob我仍将更新我的答案,请稍候,这是不允许的:
    newlistdataprovider(null)ArrayList<Instance> emptyList = new ArrayList<Instance>();
    ListDataProvider<Instance> emptyDataProvider = new ListDataProvider<>(emptyList);
    instanceGrid.setDataProvider(emptyDataProvider);
    
    ListDataProvider<Instance> dataProvider =
            DataProvider.ofCollection(ec2Client.getInstances());
    instanceGrid.setDataProvider(dataProvider);