2016-11-18 2 views
2

Мое приложение содержит TableView. В зависимости от значения конкретной ячейки в каждой строке стиль строки изменяется путем установки настраиваемой фабрики ячеек с setCellFactory для этого столбца. Это прекрасно работает.Настройка всплывающей подсказки по всем ячейкам таблицы в JavaFX

Теперь я хотел бы добавить всплывающую подсказку, которая не имеет большого значения, используя setTooltip(). Однако эта подсказка должна быть установлена ​​для для каждой ячейки в таблице, а не только для столбца, для которого она указана. Как я могу это реализовать?

ответ

9

После того как таблица будет создана (т.е. столбцы создаются и добавляются, и клеточные фабрики устанавливаются на все столбцы), вы можете «украсить» столбцы Клеточные фабрики:

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 ; 
    }); 
} 

Здесь просто заменить TableDataType с любым типом вы использовали, чтобы объявить TableView, т.е. это предполагает, что у вас есть

TableView<TableDataType> table ; 

Теперь, после того, как вы создали столбцы, добавили их к столу, и установить все их се Л.Л. фабрики, вам просто нужно:

for (TableColumn<TableDataType, ?> column : table.getColumns()) { 
    addTooltipToColumnCells(column); 
} 

или, если вы предпочитаете «Java 8» путь:

table.getColumns().forEach(this::addTooltipToColumnCells); 
+1

Одна небольшая проблема с этим состоит в том, что он показывает «нуль» для пустых ячеек, которые ISN» t очень элегантный (особенно для нетехнических пользователей). Один из способов преодоления этого - связать свойство 'tooltip' с привязкой, которая учитывает статус ячейки:' cell.tooltipProperty(). Bind (Bindings.when (Bindings.or (cell.emptyProperty(), cell.itemProperty () .isNull())), затем ((Tooltip) null) .otherwise (tooltip)); ' – Itai

+0

Только то, что я искал, спасибо! –

Смежные вопросы