5

JavaFX TableViewには、 TableColumnCell Factory をレンダリングするように設定したものと、Cell Factory を表示するように設定したものがProgressBarありTableColumnますToolTip。下の画像のように。2 番目の列にはプログレス バーが表示され、他の 3 列はツール ヒントを表示するためにレンダリングされ、表示する単純な文字列値があります。

ここに画像の説明を入力

テーブルに更新された値が表示/表示されないという問題が発生していました。つまり、UI が要素TableViewを検証/更新/ペイントしていません。TableViewをクリックして列を並べ替えると、更新ColumnHeaderが表示されるのは私だけです。TableViewテーブルの列を手動で並べ替えてテーブルの内容を更新するのは意味がないので、テーブルビューを更新するためにテーブルの列を表示/非表示にする解決策を検索して見つけました。

TableViewこの問題を解決するために、更新/更新の問題を解決するために以下のコードを書きましたが、このコードが原因で現在ToolTip表示されていません。

特定の間隔ごとにテーブル ビューを更新するコード

 class TableProgressBarUpdator implements Runnable {

        TableView table;

        public TableProgressBarUpdator(TableView fxtable) {
            table = fxtable;

        }

        public void start() {
            new Thread(this).start();
        }

        public void run() {

            while (keepUpdating) {
                try {
                    updateProgressbar();
                    Thread.sleep(1000);
                } catch (Exception e) {
                    LogHandler.doErrorLogging("Error while updating tables cell", e);
                }
            }
            LogHandler.doDebugLogging("Table process repainting is completed.");
        }

        private void updateProgressbar() throws Exception {
            Platform.runLater(new Runnable() {
                @Override
                public void run() {
                    ((TableColumn) table.getColumns().get(0)).setVisible(false);
                    ((TableColumn) table.getColumns().get(0)).setVisible(true);
                }
            });


        }
    }

テーブル ビューの更新を開始

public void startUpdatingTableProgress() {
    keepUpdating = true;
    TableProgressBarUpdator tpu = new TableProgressBarUpdator(table);
    tpu.start();
}

テーブル ビューの更新を停止する

public void stopUpdatingTableProgress() {
        keepUpdating = false;
    }

プログレス バーとツール ヒントを表示するレンダー クラスを表示するコードを追加します。

プログレス バー テーブル ビューを表示するコード。

public static class ProgressBarTableCell<S, T> extends TableCell<S, T> {

        private final ProgressBar progressBar;
        private ObservableValue<T> ov;

        public ProgressBarTableCell() {
            this.progressBar = new ProgressBar();
            progressBar.setPrefHeight(23);
            setAlignment(Pos.CENTER);
        }

        @Override
        public void updateItem(T item, boolean empty) {
            super.updateItem(item, empty);
            if (item == null) {
                setGraphic(null);
                setText(null);
            } else {
                if (item.toString().equalsIgnoreCase("Processing")) {
                    Platform.runLater(new Runnable() {
                        @Override
                        public void run() {

                            if (getGraphic() == null) {
                                setGraphic(progressBar);
                                progressBar.setProgress(-1);
                            } else {
                                ProgressBar objpProgressBar = (ProgressBar) getGraphic();
                                objpProgressBar.setProgress(-1);
                            }
                            setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
                        }
                    });
                } else {
                    Platform.runLater(new Runnable() {
                        @Override
                        public void run() {
                            if (getGraphic() == null) {
                                setGraphic(progressBar);
                                progressBar.setProgress(0);
                            } else {
                                ProgressBar objpProgressBar = (ProgressBar) getGraphic();
                                objpProgressBar.setProgress(0);
                            }
                            setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
                        }
                    });
                }
            }
        }
    } 

ツール ヒントを表示するコード

public class ToolTip extends TableCell {

        @Override
        protected void updateItem(Object object, boolean selected) {
            if (object == null) {
                setGraphic(null);
                setText(null);
            }else{
                setText(object.toString());
                setTooltip(new Tooltip(object.toString()));
            }
        }
    }

問題 -

TableProgressBarUpdator クラスからこれらの 2 行をコメント アウトすると、1 列目、3 列目、4 列目の各セル値のツール ヒントを表示できますが、テーブル ビューの内容が更新/更新されず、これらの行のコメントを外すと、ツール ヒントが表示されません。

((TableColumn) table.getColumns().get(0)).setVisible(false);
((TableColumn) table.getColumns().get(0)).setVisible(true);

これらの 2 行が原因で、Tool Tip Render が機能しません。これらの 2 行を削除すると、テーブル ビュー コンテンツが更新/更新されません。

4

2 に答える 2

1

ProgressBarTableCell 内で Platform.runLater() 呼び出しが必要ですか? すでにアプリケーションスレッドにあると思います。これにより、スケジュールされたテーブルの更新後に、進行状況バーの更新がアプリケーション スレッドのキューの最後に配置される可能性があります。

TableCell の値は ObservableProperty にラップされていますか (SimpleStringProperty が必要なようです)? そうした場合、テーブルは更新が必要であることを認識する必要があり、テーブルを強制的に更新するためのハックとして列の表示を切り替えることに頼る必要はありません。

于 2012-12-04T23:03:54.193 に答える