gpt4 book ai didi

java - 加载 UI 并仅在数据准备好时渲染组件(网格)

转载 作者:行者123 更新时间:2023-11-30 02:19:53 25 4
gpt4 key购买 nike

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

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

  1. 用户选择组合框
  2. 我的顶部有一个进度条,用户界面没有改变
  3. 当数据提供者拥有数据时,UI 会发生变化,网格会获取新信息。

我想要什么:

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

我的代码是:

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定义有一个成员变量

最佳答案

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

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

What I would like :

  1. The user select the combo box
  2. The UI change, I can only see the combo box (and optionally, the empty grid)

使用空 Collection<Instance> 创建 dataProvider s。将其设置为网格 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. when the dataprovider have the data, it fill the grid

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

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

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

关于java - 加载 UI 并仅在数据准备好时渲染组件(网格),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47181960/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com