Перенос текста в JavaFX TableView редактируемый TextFieldTableCell



Мой TableView состоит из нескольких столбцов и обертывает текст со следующим cellfactory:



private void setWrapCellFactory(TableColumn<CustomObject, String> table) {
table.setCellFactory(tablecol -> {
TableCell<CustomObject, String> cell = new TableCell<>();
Text text = new Text();
cell.setGraphic(text);
text.wrappingWidthProperty().bind(cell.widthProperty());
text.textProperty().bind(cell.itemProperty());
return cell;
});
}


Это прекрасно работает для отображения не редактируемого текста.



Последний столбец должен быть редактируемым и может охватывать несколько строк (не строк TableView). Чтобы избежать эллипсов, я хотел бы завернуть новый отредактированный текст.

После нескольких часов попыток я все еще не могу заставить его работать. У меня есть следующий код для редактирования моей ячейки и нерабочая попытка обернуть оно.

Нерабочий способ обернуть мой отредактированный текст:



private void setWrapCellFactoryEditable(TableColumn<CustomObject, String> table) {
table.setCellFactory(tablecol -> {
TableCell<CustomObject, String> cell = new TextFieldTableCell<>(new DefaultStringConverter());
Text text = new Text();
text.setText(text.toString());
text.wrappingWidthProperty().bind(cell.widthProperty());
return cell;
});
}


Следующий код является настройкой столбца:



feedbackCol.setCellValueFactory(ev -> new ReadOnlyStringWrapper(ev.getValue().getLastFeedback()));
setWrapCellFactoryEditable(feedbackCol);
feedbackCol.setOnEditCommit((CellEditEvent<CustomObject, String> ev) -> {
int id = ((CustomObject) ev.getTableView().getItems().get(
ev.getTablePosition().getRow())).getId();
dc.addTempFeedback(id, ev.getNewValue());
});


Для обычного не редактируемого текста я использую TableCell, для редактируемого текста я использую TextFieldTableCell. Я не знаю, почему упаковка не работает с редактируемыми ячейками.

1091   1  

1 ответ:

Вам нужно создать свой собственный класс extending TextFieldTableCell. Он должен переопределить методы cancelEdit() и updateItem() для изменения графического изображения ячейки на компонент Text (равный тому, который вы использовали для не редактируемых ячеек) по завершении редактирования.

public class WrappingTextFieldTableCell<S> extends TextFieldTableCell<S, String> {

    private final Text cellText;

    public WrappingTextFieldTableCell() {
        super(new DefaultStringConverter());
        this.cellText = createText();
    }

    @Override
    public void cancelEdit() {
        super.cancelEdit();
        setGraphic(cellText);
    }

    @Override
    public void updateItem(String item, boolean empty) {
        super.updateItem(item, empty);
        if (!isEmpty() && !isEditing()) {
            setGraphic(cellText);
        }
    }

    private Text createText() {
        Text text = new Text();
        text.wrappingWidthProperty().bind(widthProperty());
        text.textProperty().bind(itemProperty());
        return text;
    }
}

Comments

    Ничего не найдено.