JavaFX TableColumn text wrapping

У меня возникает проблема при изменении размера таблицы TableView, содержащей текстовые элементы, которые обтекают элементы TableCell. При изменении размера скрытые значения изменяются, но видимые элементы не переучитывают перенос текста.

The issue.

Твиты в красном поле были скрыты во время изменения размера и были скорректированы, как и ожидалось. Твиты над полем были видны во время фазы изменения размера и все еще имеют старую упаковку.

Ниже мой код для фазы изменения размера.

fxSearchResultsTableTweet.setCellFactory(new Callback<TableColumn<Status, String>, TableCell<Status, String>>() {
        @Override
        public TableCell<Status, String> call(TableColumn<Status, String> arg0) {
            return new TableCell<Status, String>() {
                private Text text;

                @Override
                public void updateItem(String item, boolean empty) {
                    super.updateItem(item, empty);
                    if (!isEmpty()) {
                        text = new Text(item.toString());
                        text.setWrappingWidth(fxSearchResultsTableTweet.getWidth());
                        this.setWrapText(true);

                        setGraphic(text);
                    }
                }
            };
        }
    });
}

Любая помощь будет принята с благодарностью.

Ответ 1

Это ближе, но не очень хорошо:

    textCol.setCellFactory(new Callback<TableColumn<Status, String>, TableCell<String, String>>() {

        @Override
        public TableCell<Status, String> call(
                TableColumn<Status, String> param) {
            TableCell<Status, String> cell = new TableCell<>();
            Text text = new Text();
            cell.setGraphic(text);
            cell.setPrefHeight(Control.USE_COMPUTED_SIZE);
            text.wrappingWidthProperty().bind(cell.widthProperty());
            text.textProperty().bind(cell.itemProperty());
            return cell ;
        }

    });

В 2.2 это отображает неправильную высоту, когда вы добавляете новые элементы в таблицу, а затем при изменении размера ячейки правильно сортируются. В 8 он почти идеален, кажется, что он провалился после добавления первого элемента (по крайней мере, в моем макете).

Как отмечено в комментариях,

textCol.setCellFactory(tc -> {
    TableCell<Status, String> cell = new TableCell<>();
    Text text = new Text();
    cell.setGraphic(text);
    cell.setPrefHeight(Control.USE_COMPUTED_SIZE);
    text.wrappingWidthProperty().bind(textCol.widthProperty());
    text.textProperty().bind(cell.itemProperty());
    return cell ;
});

похоже, работает лучше.

Ответ 2

Просто добавьте фабрику ячеек в каждую таблицу столбцов. Это следует добавить перед добавлением ваших данных в табличное представление. Это хорошо работает для меня.

    yourTableColumn.setCellFactory(param -> {
        return new TableCell<YourDataClass, String>() {
            @Override
            protected void updateItem(String item, boolean empty) {
                super.updateItem(item, empty);

                if (item == null || empty) {
                    setText(null);
                    setStyle("");
                } else {
                    Text text = new Text(item);
                    text.setStyle("-fx-text-alignment:justify;");                      
                    text.wrappingWidthProperty().bind(getTableColumn().widthProperty().subtract(35));
                    setGraphic(text);
                }
            }
        };
    });