在JavaFX中的所有表格单元格上设置工具提示

Rob*_*uch 3 javafx javafx-8

我的申请包含一个TableView.根据每行中特定单元格的值,通过setCellFactory为此列设置自定义单元格工厂来更改行样式.这很好用.

现在我想添加一个没什么大不了的工具提示setTooltip().但是,应为表中的每个单元格设置此工具提示,而不仅仅是为其指定的列.我该如何实现呢?

Jam*_*s_D 12

设置表后(即创建并添加列,并在所有列上设置单元工厂),您可以"装饰"列的单元工厂:

private <T> void addTooltipToColumnCells(TableColumn<TableDataType,T> column) {

    Callback<TableColumn<TableDataType, T>, TableCell<TableDataType,T>> existingCellFactory 
        = column.getCellFactory();

    column.setCellFactory(c -> {
        TableCell<TableDataType, T> cell = existingCellFactory.call(c);

        Tooltip tooltip = new Tooltip();
        // can use arbitrary binding here to make text depend on cell
        // in any way you need:
        tooltip.textProperty().bind(cell.itemProperty().asString());

        cell.setTooltip(tooltip);
        return cell ;
    });
}
Run Code Online (Sandbox Code Playgroud)

这里只是替换TableDataType你用来声明你的任何类型TableView,即假设你有

TableView<TableDataType> table ;
Run Code Online (Sandbox Code Playgroud)

现在,创建了列,将它们添加到表中并设置所有单元工厂之后,您只需要:

for (TableColumn<TableDataType, ?> column : table.getColumns()) {
    addTooltipToColumnCells(column);
}
Run Code Online (Sandbox Code Playgroud)

或者如果您更喜欢"Java 8"方式:

table.getColumns().forEach(this::addTooltipToColumnCells);
Run Code Online (Sandbox Code Playgroud)

  • 这样做的一个小问题是,它对空单元格显示“null”,这不是很优雅(特别是对于非技术用户)。解决这个问题的一种方法是将“tooltip”属性绑定到考虑单元格状态的绑定:“cell.tooltipProperty().bind(Bindings.when(Bindings.or(cell.emptyProperty(), cell.itemProperty()” ).isNull())).then((Tooltip) null).otherwise(tooltip));` (2认同)