当前位置: 首页 > 面试题库 >

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

宋稳
2023-03-14
问题内容

我的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。我不知道为什么包装不能在可编辑单元格中使用。


问题答案:

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


 类似资料:
  • 是否可以使可单击但不可编辑。 我不希望它是可编辑的(键盘也不应该出现,我们也不应该改变提示) 实际上,我只想使用编辑文本作为带有提示的图像(不能更改)。我知道实际的方法是使用一个和一个,但我希望它尝试使用,因为这样我将只使用一个视图,而不是2个。而且每件事都是动态的,所以没有XML。 对于上述需求,XML中的解决方案是android:editable=“false”,但我想在Java中使用它。 但

  • 我是Yii 2的新手!我在我的基本yii中安装了kartik网格,并创建了一个没有问题的网格。现在我想用 卡地克\网格\编辑列 但它需要: \kartik\可编辑\可编辑 我安装了可编辑via composer,现在我可以在我的供应商文件中看到该目录:我的供应商文件 现在系统再次给我这个错误: 无效配置-yii\base\InvalidConfigExc0019 未找到类\kartik\edabl

  • 任何人都可以知道如何做到这一点吗? 我想这是一个编辑文本,但是我怎么能同时放标签和文本呢? 先谢谢你

  • 编辑文本 要选择一种文字图层,请执行下列操作之一: 选择“移动”工具 并在画布上双击文字图层。 选择横排文字工具 或竖排文字工具。在“图层”面板中选择文字图层,或者单击文本流以自动选择文字图层。 在文本中定位到插入点,然后执行下列操作之一: 单击以设置插入点。 选择要编辑的一个或多个字符。 根据需要输入文本。 要将更改应用到文字图层,请执行下列操作之一: 选择一个新工具。 在“图层”面板中单击某个

  • 我通过。我想编辑包。它在哪里(在ubuntu 12.04上)以及如何在每次编辑源代码并运行它时重新加载它? 目前我正在编辑源代码,然后一次又一次地运行python setup.py,结果证明这很麻烦。

  • Ruby我已经开始在我的Ruby代码中插入不可编辑的文本,我觉得这很烦人。例如,这个简单的rSpec表达式: ...变成了这样: 另一个例子是: ...变成了这样: 如何关闭此功能?