滚动时不调用updateItem

时间:2015-03-12 14:49:30

标签: javafx-2 tableview tablecell

我正在将数据库中的表加载到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));
            }

1 个答案:

答案 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("");
        }
    }
}