【问题标题】:JavaFX TableColumn text wrappingJavaFX TableColumn 文本换行
【发布时间】:2014-05-09 01:07:54
【问题描述】:

我在调整包含环绕 TableCell 项的文本项的 TableView 大小时遇到​​问题。调整大小时,隐藏值会调整大小,但可见项不会重新计算文本换行。

红框中的推文在调整大小期间被隐藏,并按预期调整了它们的文本换行。框上方的推文在调整大小阶段可见,并且仍然具有旧包装。

以下是我调整大小阶段的代码。

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);
                    }
                }
            };
        }
    });
}

任何帮助将不胜感激。

【问题讨论】:

  • 试试text.wrappingWidthProperty().bind(widthProperty());widthProperty 是单元格的宽度。我很快模拟了这个,宽度表现得很好,虽然高度没有。
  • 这很有趣,对我来说也一样。您对如何解决高度问题有任何想法吗?
  • 没有。它实际上在选择方面表现得非常糟糕。如果您使用默认 TableCell 并将文本绑定到单元格的 item 属性(我将发布代码),它似乎更好,但仍然不完美。
  • 请注意,如果您使用Text 而不是像这里的Label,如果您的文本很小,您可以使用-fx-font-smoothing-type: LCD; 来避免混叠问题。

标签: java javafx javafx-2 tableview


【解决方案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 中它几乎是完美的,只是在添加第一个项目后似乎失败了(至少在我的模型中)。

如 cmets 中所述,

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 ;
});

似乎效果更好。

【讨论】:

  • 如果将 Text 的宽度绑定到列 widthProperty 而不是 cell.widthProperty,它就像一个魅力。只需替换“text.wrappingWidthProperty().bind(cell.widthProperty());”与“text.wrappingWidthProperty().bind(textCol.widthProperty());”
【解决方案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);
                }
            }
        };
    });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-27
    • 2013-11-25
    • 2013-11-09
    • 2018-07-21
    • 1970-01-01
    • 2020-05-07
    • 2020-09-01
    相关资源
    最近更新 更多