2

基本的に、このプログラムは、各セルを特定の数値で更新する必要がある 9x9 マトリックスです。マトリックス用のテーブルがあります。0 に初期化しました。プログラムは動作していますが、すべてが完了した後、テーブルは 1 回だけ更新されます。(解決策が見つかりました)。

データが舞台裏で変更されているため、表のセルは更新されません。プログラムの実行が終了すると、テーブル全体が更新されます。しかし、各セルに値を割り当てると、各数値がリアルタイムで変化するのを確認したいと考えています。コードのヘルプは本当にありがたいです。

私もコンテナを持たないでこれを試しました。しかし、それもテーブルを更新しませんでした。私が行った調査によると、テーブルに 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;

        }
4

1 に答える 1

2

一見すると、すべての「セルを変更する」ロジックが単一の clickListener 内 (つまり、solveSoduku 内) で発生しているように見えます。

イベント リスナー内のすべてのコードは、単一の要求/応答サイクル内で発生します。つまり、UI はメソッドが完了するまで更新されません。これは、Vaadin アーキテクチャの基本的な部分です。

中間の更新を「見たい」場合は、バックグラウンド スレッドを作成して解決を行い、「プッシュ」ソリューションを使用してテーブルを更新する必要があります。Vaadin 7.1.0 (最近リリースされた) にはプッシュが組み込まれています。それ以外の場合は、Vaadin フォーラムのこのスレッドを参照してください。

于 2013-07-01T07:40:49.290 に答える