Зависимый от ячейки внешний вид ячейки в JavaFX

Как я могу изменить внешний вид ячейки на основе состояния другой ячейки в том же столбце tableView в JavaFX.

colHidden.setCellValueFactory(param -> {
        return param.getValue().hiddenProperty();
    });

colHidden.setCellFactory(tc -> new CheckBoxTableCell<>());
    colLabel.setCellFactory(...);

У меня есть ячейка, содержащая CheckBoxTableCell<>(). Когда я устанавливаю этот флажок, содержимое ячейки colLabel должно быть заменено звездочками.


person Molitoris    schedule 08.05.2018    source источник


Ответы (1)


Вы можете сделать что-то вроде этого. Основная идея здесь состоит в том, чтобы «запомнить» свойство, соответствующее флажку в той же строке, предполагая, что ячейка не пуста, и добавить к ней прослушиватель, который обновляет текст. Затем удалите прослушиватель из предыдущего свойства при каждом обновлении ячейки.

colLabel.setCellFactory(col -> new TableCell<RowType, ColumnType>() {
    private ObservableValue<Boolean> hiddenProperty ;

    ChangeListener<Boolean> listener = (obs, wasHidden, isNowHidden) -> updateText(isNowHidden);

    @Override
    protected void updateItem(ColumnType item, boolean empty) {
        super.updateItem(item, empty);
        if (hiddenProperty != null) {
            hiddenProperty.removeListener(listener);
        }
        if (empty) {
            setText(null);
            hiddenProperty = null ;
        } else {
            hiddenProperty = getTableView().getItems().get(getIndex()).hiddenProperty();
            hiddenProperty.addListener(listener);
            updateText(hiddenProperty.get());
        }
    }

    private void updateText(boolean hidden) {
        if (hidden) {
            setText("********");
        } else {
            setText(getItem().toString()); // or other format for string, etc
        }
    }
}

Замените RowType и ColumnType фактическими типами, используемыми colLabel (т. е. предполагается, что у вас есть TableColumn<RowType, ColumnType> colLabel ;).

person James_D    schedule 08.05.2018
comment
Спасибо за это изящное решение. Это работало из коробки. Я не понимаю, почему я должен проверять, скрыто ли свойство != null. - person Molitoris; 08.05.2018
comment
@Caduceus Это будет нуль при первом вызове updateItem(..) (как минимум). (На самом деле, если ячейка тоже пуста, то, вероятно, следует установить ее обратно на ноль. Я это исправлю.) - person James_D; 08.05.2018