Перенос текста в 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. Я не знаю, почему упаковка не работает с редактируемыми ячейками.
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