updateItem не вызывается при прокрутке
Я загружаю таблицу из базы данных в таблицу. Я использую пользовательские CellFactory в определенных столбцах в зависимости от их типа / значения. В основном мне нужно выделить ячейки в столбцах типа Float, которые находятся выше порога. Я вижу, что это работает, когда представление таблицы заполняется впервые, но когда я прокручиваю таблицу или сортирую столбцы, рендеринг портится, т.е. не работает. Я заметил, что updateItem не вызывается при прокрутке или сортировке. Как я могу сделать рендеринг TableView "правильным" независимо от прокрутки и сортировки?
Это часть кода, которую я использую:
else
{
TableColumn col=new TableColumn(rs.getMetaData().getColumnName(i+1));
col.setCellValueFactory(new Callback<CellDataFeatures<ObservableList,Float>,ObservableValue<Float>>()
{
@Override
public ObservableValue<Float> call(CellDataFeatures<ObservableList, Float> param)
{
return new SimpleObjectProperty(param.getValue().get(j));
}
});
col.setCellFactory(new Callback<TableColumn<ObservableList, ObservableValue<Float>>, TableCell<ObservableList, Float>>()
{
@Override
public TableCell<ObservableList, Float> call(TableColumn<ObservableList,ObservableValue<Float>> param)
{
TableCell<ObservableList,Float> cell=new TableCell<ObservableList,Float>()
{
@Override
public void updateItem(Float item, boolean empty)
{
super.updateItem(item, empty);
if(item!=null)
{
if(item>0.5)
{
setText(item.toString());
setTextFill(Color.BLACK);
setFont(Font.font(null, FontWeight.BOLD, 12));
setStyle("-fx-background-color:RED");
}
else
{
setText(item.toString());
setTextFill(Color.BLACK);
}
}
}
};
return cell;
}
});
table.getColumns().addAll(col);
col.prefWidthProperty().bind(table.prefWidthProperty().divide(10));
}
1 ответ
Вам просто нужно реализовать свою логику, чтобы правильно обрабатывать все случаи. Например, если ячейка используется повторно от значения больше 0,5 до значения меньше 0,5, стиль никогда не сбрасывается.
Тебе нужно
@Override
public void updateItem(Float item, boolean empty) {
super.updateItem(item, empty);
if(item==null) {
setText(null);
} else {
setText(item.toString());
setTextFill(Color.BLACK);
if(item>0.5) {
setFont(Font.font(null, FontWeight.BOLD, 12));
setStyle("-fx-background-color:RED");
} else {
setFont(Font.font(null, FontWeight.NORMAL, 12));
setStyle("");
}
}
}