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("");
        }
    }
}    
Другие вопросы по тегам