Клеточно-зависимый вид ячейки в JavaFX - PullRequest
0 голосов
/ 08 мая 2018

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

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

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

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

1 Ответ

0 голосов
/ 08 мая 2018

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

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

...