TableView中的可编辑多行单元格

时间:2014-12-27 10:30:04

标签: javafx tableview javafx-8

(有already is a question regarding this,但它没有答案,评论也无济于事。)

我有一个TableView,我想要一个包含多行标签的列,我可以编辑。理想情况下,行为类似于TextFieldTableCell但具有多行支持:

  • 它显示文字,如标签。
  • 点击后,它会转换为TextField(或在本例中为TextArea),以便对文字进行修改。

我还没有找到解决方案。我现在唯一的解决方法是将TextArea作为单元格的“图形”:

    descriptionTableColumn.setCellFactory(param -> new TableCell<Attachment, String>() {
        @Override
        protected void updateItem(String item, boolean empty) {
            if (empty) {
                setGraphic(null);
            } else {
                TextArea area = new TextArea(item);
                area.setMinHeight(USE_COMPUTED_SIZE);
                area.setPrefHeight(USE_COMPUTED_SIZE);
                area.setMaxHeight(USE_COMPUTED_SIZE);
                setGraphic(area);
            }
        }
    });

(此处缺少用于收听文本更改的代码;它不会触发OnEditCommit事件。)

但是,TextArea始终呈现为带有边框和白色背景的普通TextArea。我可以忍受这一点。但即使我设置USE_COMPUTED_SIZE,该区域也总是以一定的高度(大约180px)渲染,即使我设置了TextFieldTableCell

所以问题是:

  • 有没有办法获得理想的行为,类似于TextArea
  • 如果没有,有没有办法让{{1}}只使用所需的高度?

1 个答案:

答案 0 :(得分:7)

好的,基本的想法是复制TextFieldTableColumn并调整其行为以创建TextAreaTableColumn。我一起攻击了一个小的工作示例实现:https://gist.github.com/eckig/30abf0d7d51b7756c2e7

用法:

TableColumn<?, ?> column = new TableColumn<>();
column.setCellValueFactory(...);
column.setCellFactory(TextAreaTableCell.forTableColumn()); // add StringConverter if neccessary
tableView.getColumns().add(column);

但是,还有一些事情需要实施/调整:

  1. 调整prefRowCount以仅显示必要的行数。
  2. 也许调整prefColumnCount
  3. 因为“Enter”键被新行占用,我不得不添加一个Save Button来提交编辑。这有点难看,但是现在我没有更好的主意。
  4. 但希望你能得到这个想法; - )