【问题标题】:Unable to show the Tool Tip on the JavaFX TableView cell value无法在 JavaFX TableView 单元格值上显示工具提示
【发布时间】:2012-11-21 22:36:06
【问题描述】:

在我的JavaFXTableView 中,我有一个TableColumn,我已将 Cell Factory 设置为渲染ProgressBar,而对于其他TableColumns,我已将 Cell Factory 设置为显示ToolTip。就像下图一样。第二列显示进度条,其他 3 列渲染以显示工具提示,其中包含要显示的简单字符串值。

我遇到了TableView 未在表中显示/显示更新值的问题,即 UI 未验证/刷新/绘制 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 类中注释掉这两行,那么我可以看到第 1、第 3 和第 4 列中每个单元格值的工具提示,但现在表视图内容没有更新/刷新,当我 UN - 评论这些行我看不到工具提示。

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

由于这两行,我的工具提示渲染不起作用,如果我删除这两行,则表视图内容不会刷新/更新。

【问题讨论】:

    标签: java javafx-2


    【解决方案1】:

    您无需手动更新TableView。您的班级中可能存在与 TableView's column 相关的问题。

    您必须创建如下所示的类:

    public static class Test{
    
    private StringProperty name;
    
    private Test() {
       name = new SimpleStringProperty();
    }
    
    public Test(String name) {
        this.name = new SimpleStringProperty(name);
    }
    
    public void setName(String name) {
        this.name.set(name);
    }
    
    public String getName() {
        return name.get();
    }
    
    public StringProperty nameProperty() {
        return name;
    }
    

    }

    【讨论】:

      【解决方案2】:

      您确定需要在 ProgressBarTableCell 中调用 Platform.runLater() 吗?我希望它已经在应用程序线程中。这可能会导致进度条更新被放置在应用程序线程中队列的末尾,在计划的表更新之后。

      您的 TableCell 的值是否包含在 ObservableProperty 中(看起来您应该有一个 SimpleStringProperty)?如果你这样做了,表格应该会意识到它需要刷新,并且你不应该求助于切换列的可见性作为强制刷新表格的技巧。

      【讨论】:

      • 我已经注释掉了 Platform.runLater() 但仍然没有运气。我正在使用 SimpleStringProperty 设置/获取值,这些值与列相关联。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-06-07
      • 1970-01-01
      • 2015-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多