简体   繁体   English

JavaFX TableColumn文本包装

[英]JavaFX TableColumn text wrapping

I am experiencing an issue when resizing a TableView which contains text items that wrap around TableCell items. 我在调整包含围绕TableCell项目的文本项的TableView时遇到问题。 Upon resizing, hidden values are resized but the visible items do not re-calculate the text wrapping. 调整大小时,隐藏的值会调整大小,但可见项不会重新计算文本换行。

问题。

The tweets in the red box were hidden during the resize and had their text wrapping adjusted as expected. 红色框中的推文在调整大小期间被隐藏,并按预期调整文本包装。 Tweets above the box were visible during the resize phase and still have the old wrapping. 在调整大小阶段期间,框上方的推文可见,并且仍然具有旧的包装。

Below is my code for the resize phase. 下面是我调整大小阶段的代码。

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

Any help would be greatly appreciated. 任何帮助将不胜感激。

This is closer, but not great: 这更接近,但不是很好:

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

    });

In 2.2 this displays the wrong height when you add new items to the table, then on resize the cells are sized correctly. 在2.2中,当您向表中添加新项目时显示错误的高度,然后在调整大小时正确调整单元格的大小。 In 8 it's almost perfect, just seems to fail after the first item is added (at least in my mock-up). 在8它几乎完美,似乎在添加第一个项目后失败(至少在我的模型中)。

As noted in the comments, 如评论中所述,

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

appears to work better. 似乎工作得更好。

Just add cell factory on each table of column. 只需在每个列表上添加单元工厂。 It should add before adding your data to table view. 它应该在将数据添加到表视图之前添加。 It is worked fine for me. 它对我来说很好。

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

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

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