Vaadin表没有实时更新

时间:2013-06-29 17:01:38

标签: java refresh vaadin

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

由于数据在场景后面发生变化,表格单元格没有得到更新。 整个表在程序执行结束时得到更新。但我希望看到每一个 当我为每个单元格分配一个值时,数字会改变实时。任何代码帮助都非常感谢。

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

此外,论坛正在说

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

上述行应足以反映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;

        }

1 个答案:

答案 0 :(得分:2)

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

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

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