3

我不会将格式化文本放在 JavaFX 表中。首先,我试图嵌入一个 Webview,但我遇到了单元格高度问题。这似乎是 JavafX 中的一项任务功能(请参阅:Java FX: TableView - display simple HTML)。

根据此处的建议,我尝试嵌入 TextFlow。然而,TabelCell 的大小再次不正确。我希望行的高度一样大,单元格的内容适合其中。更改列宽应导致更改行高。

这是我的最小运行示例。

import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.ContentDisplay;
import javafx.scene.control.TableCell;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.Region;
import javafx.scene.paint.Color;
import javafx.scene.text.Text;
import javafx.scene.text.TextFlow;
import javafx.stage.Stage;

public class TableViewSample extends Application {


    private final ObservableList<MyData> data = FXCollections.observableArrayList(new MyData(1L), new MyData(3L), new MyData(2L), new MyData(4L), new MyData(1L));

    public static void main(final String[] args) {
        launch(args);
    }

    @Override
    public void start(final Stage stage) {
        final Scene scene = new Scene(new Group());

        TableView<MyData> table = new TableView<>();

        final TableColumn<MyData, Long> nameCol = new TableColumn("So So");
        nameCol.setMinWidth(200);
        nameCol.setCellValueFactory(new PropertyValueFactory<>("i"));

        // Allow to display Textflow in Column

        nameCol.setCellFactory(column -> {
            return new TableCell<MyData, Long>() {
                @Override
                protected void updateItem(Long item, boolean empty) {
                    super.updateItem(item, empty);

                    if (item == null || empty) {

                        setText(null);
                        setStyle("");

                    } else {

                        // Generate Textflow with variable length

                        TextFlow textFlow = new TextFlow();
                        textFlow.setPrefHeight(Region.USE_COMPUTED_SIZE);

                        for (Long ii = 1L; ii <= item; ii++) {
                            Text text1 = new Text("la la la ");
                            text1.setFill(Color.RED);

                            Text text2 = new Text("blue blue blue ");
                            text2.setFill(Color.BLUE);
                            textFlow.getChildren().add(text1);
                            textFlow.getChildren().add(text2);


                        }

                        setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
                        setGraphic(textFlow);
                   //     setPrefHeight(20); // <- Shows the expected effect.
                                             // However I want to have variable height of row. 
                         setPrefHeight(Region.USE_COMPUTED_SIZE);  // <- Why is that not working

                    }
                }
            };
        });



        table.setItems(data);
        table.getColumns().addAll(nameCol);

        ((Group) scene.getRoot()).getChildren().addAll(table);

        stage.setScene(scene);
        stage.show();
    }

    public static class MyData {
        private Long i;
        public MyData(Long i) {  this.i = i;      }
        public Long getI() {    return i;      }
    }

}

如您所见,行高太大了。有什么建议么? 在此处输入图像描述

4

2 回答 2

4

我在应用程序中遇到了同样的问题,并认为这是 FX 代码中的错误。调试JDK代码后,我终于明白问题出在哪里了。

在渲染过程中,TextFlow将询问它的首选高度,宽度为 -1。然后TextFlowLayout将返回高度,就好像它必须在极窄的列中显示所有内容一样,从而导致首选高度与对象中的字符数成正比TextFlow。因为一行的高度在 a 中没有限制,TableView否则TreeTableView表格将分配对象的首选高度,TextFlow从而导致上述奇怪的外观。

该问题可以通过将单元格的首选高度设置为的高度来解决,如果单元格的宽度发生变化,则textFlow另外在宽度上添加一个ChangeListner以适应高度。

setPrefHeight(textFlow.prefHeight(nameCol.getWidth()) + 4);

nameCol.widthProperty().addListener((v, o, n) -> 
setPrefHeight(textFlow.prefHeight(n.doubleValue()) + 4));
于 2017-12-15T12:58:46.920 回答
0

TableView 增加单元格中每个文本节点的单元格高度。如果您使用 TextFlow 组件,则行会增加自己的高度,就好像每个字母都在单独的行中一样。

图片

我不知道如何防止这个错误。

我可以建议您在单元格中只使用一个 Text 节点,或者使用 ListView 代替 TableView。这个组件没有这个缺点。

于 2017-05-23T09:47:24.493 回答