繁体   English   中英

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

[英]Wrapping text in a JavaFX TableView editable 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 我不知道为什么包装不适用于可编辑的单元格。

您需要创建自己的扩展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;
    }
}
  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)));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM