在JavaFX TableView可编辑TextFieldTableCell中包装文本

问题描述

您需要创建自己的扩展类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。我不知道为什么包装不能在可编辑单元格中使用。

猜你在找的技术问答相关文章

如何检查配对的蓝牙设备是打印机还是扫描仪(Android)
是否允许实体正文进行HTTP DELETE请求?
如何将ZipInputStream转换为InputStream?
java.util.logging Java 8中的变量
PowerMockito.doReturn返回null
Java中的RESTful调用
Swing / Java:如何正确使用getText和setText字符串
特殊字符和重音字符
Android Studio中的ndk.dir错误
错误“找不到主类”