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

person tgriparis    schedule 12.03.2015    source источник


Ответы (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("");
        }
    }
}    
person James_D    schedule 12.03.2015
comment
Да, получилось. Кажется, я плохо разбираюсь в методах setSetyle() и setText(). Спасибо! - person tgriparis; 13.03.2015