我的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
。我不知道为什么包装不能使用可编辑的单元格。
答案 0 :(得分:3)
您需要创建自己的扩展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;
}
}
答案 1 :(得分:0)
public static class TextAreaTableCell<S> extends TextFieldTableCell<S, String> {
private final IntFunction<ObservableValue<Boolean>> editableExtractor;
private TextArea textArea;
private final Text cellText;
public TextAreaTableCell(IntFunction<ObservableValue<Boolean>> editableExtractor, StringConverter<String> converter) {
super(converter);
this.editableExtractor = editableExtractor;
this.cellText = createText();
}
@Override
public void updateIndex(int i) {
super.updateIndex(i);
if (i == -1) {
editableProperty().unbind();
} else {
editableProperty().bind(editableExtractor.apply(i));
}
}
public static <S> Callback<TableColumn<S, String>, TableCell<S, String>> forTableColumn(IntFunction<ObservableValue<Boolean>> editableExtractor) {
return forTableColumn(editableExtractor, new DefaultStringConverter());
}
public static <S> Callback<TableColumn<S, String>, TableCell<S, String>> forTableColumn(IntFunction<ObservableValue<Boolean>> editableExtractor,
final StringConverter<String> converter) {
return list -> new TextAreaTableCell<>(editableExtractor, converter);
}
private void createTextArea() {
textArea = new TextArea(getString());
textArea.setWrapText(true);
textArea.setMinWidth(this.getWidth() - this.getGraphicTextGap() * 2);
textArea.focusedProperty().addListener(
(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) -> {
if (!newValue) {
commitEdit((String)textArea.getText());
}
});
}
private String getString() {
return getItem() == null ? "" : (String) getItem();
}
@Override
public void startEdit() {
if (!editableProperty().get()) {
return;
}
if (!isEmpty()) {
super.startEdit();
createTextArea();
setText(null);
setGraphic(textArea);
textArea.selectAll();
}
}
@Override
public void cancelEdit() {
if (!editableProperty().get()) {
return;
}
super.cancelEdit();
setText((String) getItem());
setGraphic(cellText);
}
@Override
public void updateItem(String item, boolean empty) {
if (!editableProperty().get()) {
return;
}
super.updateItem(item, empty);
if (empty) {
setText((String)item);
setGraphic(null);
} else {
if (isEditing()) {
if (textArea != null) {
textArea.setText(getString());
}
setText(null);
setGraphic(textArea);
} else {
setText(getString());
setGraphic(cellText);
}
}
}
private Text createText() {
Text text = new Text();
text.wrappingWidthProperty().bind(widthProperty());
text.textProperty().bind(itemProperty());
return text;
}
}
并使用:
colDiagnose.setCellFactory(TextAreaTableCell.forTableColumn(i -> Bindings.valueAt(editable, i).isEqualTo(Boolean.TRUE)));