gpt4 book ai didi

java - Vaadin 表不是实时更新

转载 作者:行者123 更新时间:2023-11-30 09:20:28 25 4
gpt4 key购买 nike

基本上,这个程序是一个 9x9 矩阵,其中每个单元格都需要用某些数字更新。我有一张矩阵表。初始化为0。程序正在运行,但表格在完成所有操作后仅更新一次。 (找到解决方案)。

表格单元格不会随着数据在后台发生变化而更新。整个表在程序执行结束时得到更新。但我想看到每一个当我为每个单元格分配一个值时,数字会实时变化。非常感谢任何代码帮助。

我在没有容器的情况下也试过了。但这也没有更新表格。我做的研究告诉我 setImmediate(true) 需要在 table 上设置。但我已经有了。

还有,论坛上说

Item itt = container.getItem(cell.getRowIndex() + 1);
Property<Integer> rrr = itt.getItemProperty(cell.getColumnIndex() + 1);
rrr.setValue(num);

以上几行应该足以反射(reflect) UI 中的数字变化。但它没有发生。我也试过了

table.refreshRowCache();
table.setCacheRate(0.1);

但是没用。

我也在论坛上读到使用一个valuechangelistner。但是,我找不到一个很好的例子来告诉我如何做到这一点,如果这是唯一的方法

private Container container = new IndexedContainer();

public class MyVaadinUI extends UI {

@Override
protected void init(VaadinRequest request) {

...
for (int i = 1; i <= 9; i++) {
container.addContainerProperty(i, Integer.class, 0);
}

for (int i = 1; i <= 9; i++) {
container.addItem(i);
}
...
table.setContainerDataSource(container);
table.setImmediate(true);

...
...

/ * this is filling the table correctly with all 0's */
populate.addClickListener(new ClickListener() {

@Override
public void buttonClick(ClickEvent event) {
...
for (int i = 1; i <= 9; i++) {
Item item = container.getItem(i);
int rowIndex = i - 1;
for (int j = 1; j <= 9; j++) {
Property<Integer> nameProperty = item.getItemProperty(j);
int columnIndex = j - 1;
nameProperty.setValue(uploadReceiver.getMatrix()[rowIndex][columnIndex]);
}

}

}
});


solveButton.addClickListener(new ClickListener() {

private boolean solveSudoko() {
...
for (int num = 1; num <= 9; num++) {

// check if no conflicts then
if (!AreThereConflicts(num, cell.getRowIndex(), cell.getColumnIndex())) {
uploadReceiver.getMatrix()[cell.getRowIndex()][cell.getColumnIndex()] = num;

// Item row = container.getItem(cell.getRowIndex() + 1);
// Property<Integer> col =
// row.getItemProperty(cell.getColumnIndex() + 1);
// col.setValue(num);
Property prop = container.getItem(cell.getRowIndex() + 1).getItemProperty(cell.getColumnIndex() + 1);
prop.setValue(num);
table.setContainerDataSource(container);

/* Table is not getting updated here ???? */

...
uploadReceiver.getMatrix()[cell.getRowIndex()][cell.getColumnIndex()] = 0; // unassign
// Item itt = container.getItem(cell.getRowIndex() + 1);
// Property<Integer> rrr =
// itt.getItemProperty(cell.getColumnIndex() + 1);
// rrr.setValue(num);
Property prop2 = container.getItem(cell.getRowIndex() + 1).getItemProperty(cell.getColumnIndex() + 1);
prop2.setValue(num);
table.setContainerDataSource(container);

/* Table is not getting updated here ???? */
}

}

return false;

}

最佳答案

快速浏览一下,似乎所有“更改单元格”逻辑都发生在单个 clickListener 中(即在 solveSoduku 中)。

事件监听器中的所有代码都将在单个请求/响应周期内发生,这意味着在方法完成之前 UI 不会更新:这是 Vaadin 架构的基本部分。

如果您想“查看”中间更新,则必须创建一个后台线程来进行求解,然后使用“推送”解决方案来更新表。 Vaadin 7.1.0(最近发布)内置推送,否则请参阅 this thread在 Vaadin 论坛上。

关于java - Vaadin 表不是实时更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17382620/

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