我正在将数据库中的表加载到tableview中。 我根据类型/值在特定列使用自定义CellFactory。基本上我需要在Float类型的列中突出显示高于阈值的单元格。 我看到这在第一次填充tableview时有效,但是当我滚动表或对列进行排序时,呈现混乱,即无效。 我注意到滚动或排序时没有调用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));
}
答案 0 :(得分:0)
您只需要实现逻辑以正确处理所有情况。例如。如果单元格从大于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("");
}
}
}