Java 加载UI并仅在数据准备就绪时呈现组件(网格)
我正在尝试加载除网格之外的UI,因为它占用了太多时间。我想加载我的UI,然后,当我的网格数据准备好时,我想显示它 在我的UI上,我有一个组合框。当用户选择它时,网格将发生变化并有其他数据。目前:Java 加载UI并仅在数据准备就绪时呈现组件(网格),java,vaadin,vaadin8,Java,Vaadin,Vaadin8,我正在尝试加载除网格之外的UI,因为它占用了太多时间。我想加载我的UI,然后,当我的网格数据准备好时,我想显示它 在我的UI上,我有一个组合框。当用户选择它时,网格将发生变化并有其他数据。目前: 用户选择组合框 我在顶部有一个进度条,用户界面没有改变 当dataprovider拥有数据时,UI将更改,网格将获取新信息 我想要的是: 用户选择组合框 在UI更改时,我只能看到组合框(以及可选的空网格) 当数据提供者拥有数据时,它将填充网格 我的代码是: regionSelection = new C
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的东西,我认为这有助于解决这个问题
但是如果我把你的问题简化一点,忘掉异步之类的东西,只坚持下面的“要求”。你能试试这个吗
我想要的是:
集合创建数据提供程序。将其设置为网格DataProvider
。它应该清空网格
ArrayList<Instance> emptyList = new ArrayList<Instance>();
ListDataProvider<Instance> emptyDataProvider = new ListDataProvider<>(emptyList);
instanceGrid.setDataProvider(emptyDataProvider);
当数据提供者拥有数据时,它将填充网格
希望它能做到这一点。但是网格中不会有任何旧数据,即使它没有等到数据准备就绪
我认为这无助于摆脱进度条。但不确定这是否是个好主意
如果某些默认数据需要,这也可以应用于初始页面加载,或者数据提供程序的集合最初可以为空,只有在明确选择组合时才会触发加载。您好,感谢您的帮助。“在那之后,像你现在这样做”在哪里?我不太明白。。。我很抱歉。我试过了,但我肯定我误解了你说的话。我用我尝试过的内容编辑我的帖子。@Bob我仍将更新我的答案,请稍候,这是不允许的:newlistdataprovider(null)你需要给出一个非空的列表,它是空的。好的,我试过了。那么,我应该让空的dataProvider,然后将dataProvider放入可运行任务中?如果没有,我不明白当我有数据时,这是如何设置网格的。您的解决方案正在使用一个新线程:)谢谢您的帮助!
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);