我的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> 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()); });
对于常规的不可编辑文本,我使用a TableCell;对于可编辑文本,我使用a TextFieldTableCell。我不知道为什么包装不能在可编辑单元格中使用。
TableCell
TextFieldTableCell
您需要创建自己的扩展类TextFieldTableCell。编辑完成后,它应覆盖cancelEdit()和updateItem()更改将单元格图形更改为Text组件的方法(等于用于不可编辑单元格的一种方法)。
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; } }