问题描述
您需要创建自己的扩展类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;
}
}
解决方法
我的TableView由几列组成,并使用以下单元工厂包装文本:
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> 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());
});
对于常规的不可编辑文本,我使用a TableCell
;对于可编辑文本,我使用a
TextFieldTableCell
。我不知道为什么包装不能在可编辑单元格中使用。