Java Vaadin表未实时更新

Java Vaadin表未实时更新,java,refresh,vaadin,Java,Refresh,Vaadin,基本上,这个程序是一个9x9矩阵,其中每个单元都需要用特定的数字进行更新。 我有一张矩阵表。已将其初始化为0。程序正在运行,但表只在完成所有操作后更新一次。(找到了解决方案) 由于数据在后台更改,因此表格单元格不会得到更新。 整个表将在程序执行结束时更新。但我想看看每个人 当我给每个单元格赋值时,数字会实时变化。非常感谢任何代码帮助 我也试过不用容器。但这也没有更新表。我做的研究告诉我,setImmediate(true)需要摆在桌面上。但我已经有了 论坛还说 Item itt = contai

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

由于数据在后台更改,因此表格单元格不会得到更新。 整个表将在程序执行结束时更新。但我想看看每个人 当我给每个单元格赋值时,数字会实时变化。非常感谢任何代码帮助

我也试过不用容器。但这也没有更新表。我做的研究告诉我,setImmediate(true)需要摆在桌面上。但我已经有了

论坛还说

Item itt = container.getItem(cell.getRowIndex() + 1);
Property<Integer> rrr = itt.getItemProperty(cell.getColumnIndex() + 1);
rrr.setValue(num);
但是没有起作用

我也在论坛上读到了使用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;

        }
private Container=new IndexedContainer();
公共类MyVaadinUI扩展UI{
@凌驾
受保护的void init(VaadinRequest请求){
...

对于(int i=1;i快速浏览,所有“更改单元格”逻辑似乎都发生在一个clickListener(即solveSoduku)中

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


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

我不明白你的问题。你想让Sliptet获得批准吗(意思是你已经找到了一个解决方法)或者你仍然需要一个替代的解决方案(通过值更改)?如果不需要,我不想使用ValueChange。因为如果我使用ValueChange,我只从事件中获取属性。我需要itemId和propertyid来更新单元格(类似-行:itemId,列:propertyid)有关更多详细信息(自述)有了更新的代码,请看感谢您的回复。我按照@CharlesAnthony的建议,做了一个推送解决方案,因为我有了vaadin 7.1。我的it工作比以前更好,但是,响应时间不是很快。而且似乎有一些错误线程没有正常终止,或者是它工作了,但是有时不是。我这里有完整的代码:[链接]
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;

        }