JavaFX TreeTableView пользовательский TreeCell с элементами управления

Я новичок в JavaFX 8 и попытался реализовать TreeTableView с некоторыми элементами управления jfxtras во втором и третьем столбце. Поэтому я настроил фабрики ячеек этих столбцов с помощью пользовательских TreeCells, например, так:

col3.setCellFactory(new Callback<TreeTableColumn<Object, String>, TreeTableCell<Object, String>>() {
        @Override
        public TreeTableCell<Object, String> call(TreeTableColumn<Object, String> param) {
            TreeTableCell<Object, String> cell = new TreeTableCell<Object, String>() {
                private ColorPicker colorPicker = new ColorPicker();
                @Override
                protected void updateItem(String t, boolean bln) {
                    super.updateItem(t, bln);               
                    setGraphic(colorPicker);                        
                }
            };
            return cell;
        }
    });

Теперь я могу видеть ColorPickers и использовать их, но столбец почему-то не реагирует на расширение или свертывание узлов столбца 1 (который показывает информацию String из POJO). Так, например, если я сверну все дерево, в третьем столбце по-прежнему будут отображаться все ColorPickers.

Итак, что еще нужно для синхронизации столбцов?

Спасибо!!

1 ответ

Когда элемент, отображаемый в ячейке, изменяется, updateItem(...) метод вызывается. Если ячейка пуста (например, потому что пользователь свернул ячейки выше), второй параметр будет true; Вы должны проверить это и сбросить графику.

Так:

col3.setCellFactory(new Callback<TreeTableColumn<Object, String>, TreeTableCell<Object, String>>() {
        @Override
        public TreeTableCell<Object, String> call(TreeTableColumn<Object, String> param) {
            TreeTableCell<Object, String> cell = new TreeTableCell<Object, String>() {
                private ColorPicker colorPicker = new ColorPicker();
                @Override
                protected void updateItem(String item, boolean empty) {
                    super.updateItem(item, empty);  
                    if (empty) {
                        setGraphic(null);
                    } else {             
                        setGraphic(colorPicker);     
                    }                   
                }
            };
            return cell;
        }
    });
Другие вопросы по тегам