12 апреля 2017 г.

javafx RowFactory или как я красил строки таблицы.

Задача тривиальная: в зависимости от значения в наборе данных, надо красить строку зелёненким цветом.
Примеров решений задачи в инете, вагон и маленькая тележка.

Обычно рекомендуют что то типа такого:

tableView.setRowFactory((row) -> {
            return new TableRow(){
                @Override
                public void updateItem(MainTable item, boolean empty){
                    super.updateItem(item, empty);
                    if (item == null || empty) {
                        setStyle("");
                    } else {
                        Iterator it = tableZakaz.getItems().iterator();
                        while (it.hasNext()) {
                            Long zakazIndex = it.next().getProductIndex();
                            Long pIndex = item.getIndex();
                            if ( Objects.equals(zakazIndex, pIndex) )   {
                                setStyle("-fx-background-color:lightgreen");
                            } 
                        }
                    }
                }
            };
        });

И оно даже работает. Но, пока в таблице не включается скроллинг. Как только в таблице начинаешь листать страницы, с удивлением обнаруживаешь, что красятся произвольные строки, в произвольном порядке.

Решение, простое.

До вызова
super.updateItem(item, empty);
Сбросьте стили.

tableView.setRowFactory((TableView row) -> {
            return new TableRow(){
                @Override
                public void updateItem(MainTable item, boolean empty){
                    // Сначала обязательно сбрасываем стиль.
                    setStyle("");
                    // и только после этого вызываем метод super.updateItem
                    super.updateItem(item, empty);
                    if (item == null || empty) {
                        setStyle("");
                    } else {
                        Iterator it = tableZakaz.getItems().iterator();
                        while (it.hasNext()) {
                            Long zakazIndex = it.next().getProductIndex();
                            Long pIndex = item.getIndex();
                            if ( Objects.equals(zakazIndex, pIndex) )   {
                                setStyle("-fx-background-color:lightgreen");
                            } 
                        }
                    }
                }
            };
        });