Javafx 2 滚动时不调用updateItem

Javafx 2 滚动时不调用updateItem,javafx-2,tableview,tablecell,Javafx 2,Tableview,Tablecell,我正在将表从数据库加载到tableview。 我在基于类型/值的特定列上使用自定义CellFactory。基本上,我需要突出显示单元格,在类型为Float的列中,这些单元格高于阈值。 我发现,当第一次填充tableview时,这种方法是有效的,但当我滚动表格或对列进行排序时,渲染会出现混乱,即无法工作。 我注意到当我滚动或排序时,updateItem没有被调用。 无论滚动和排序如何,如何使TableView呈现“正确” 这是我使用的代码部分: else

我正在将表从数据库加载到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));
            }
else
{
TableColumn col=newTableColumn(rs.getMetaData().getColumnName(i+1));
col.setCellValueFactory(新回调()
{   
@凌驾
公共observeValue调用(CellDataFeatures参数)
{                                                       
返回新的SimpleObject属性(param.getValue().get(j));
} 
});                     
col.setCellFactory(新回调()
{
@凌驾
公共TableCell调用(TableColumn参数)
{
TableCell单元格=新的TableCell()
{                                
@凌驾
public void updateItem(浮动项,布尔值为空)
{                                                                        
super.updateItem(项,空);
如果(项!=null)
{                                                                                
如果(项目>0.5)
{
setText(item.toString());
setTextFill(颜色:黑色);
setFont(Font.Font(null,fontwweight.BOLD,12));
设置样式(“-fx背景色:红色”);
}
其他的
{
setText(item.toString());
setTextFill(颜色:黑色);
}
}
}                                
};
返回单元;
}                        
});                       
table.getColumns().addAll(col);
col.prefWidthProperty().bind(table.prefWidthProperty().divide(10));
}

您只需实现逻辑即可正确处理所有情况。例如,如果单元格从大于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("");
        }
    }
}    

是的,就是这样。。似乎我对setSetyle()和setText()方法没有很好的理解。谢谢