java - TableView 单元格自动换行

标签 java javafx javafx-8

我想创建一个单元格,我可以在其中包装文本这是我目前的解决方案:

tableCol.setCellFactory(param -> {
        return new TableCell<Data, 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-padding: 5px 30px 5px 5px;"
                            + "-fx-text-alignment:justify;");
                    text.setWrappingWidth(param.getPrefWidth() - 35);
                    System.out.println(text.getLayoutBounds().getHeight()+10);//117
                    //setPrefHeight(text.getLayoutBounds().getHeight()+10); -----> This is not working somehow
                    setPrefHeight(117);
                    setGraphic(text);
                }
            }
        };
    });

这个可以工作,但问题是我必须对 PREFHEIGHT 进行硬编码。我真的不明白为什么这条线不起作用:

setPrefHeight(text.getLayoutBounds().getHeight()+10)

非常感谢任何帮助。

最佳答案

更新

应为 TableRow 指定高度:

enter image description here

package com.company;

import javafx.application.Application;
import javafx.beans.property.ReadOnlyObjectWrapper;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.TableCell;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableRow;
import javafx.scene.control.TableView;
import javafx.scene.layout.Region;
import javafx.stage.Stage;

public class Main extends Application {

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

    @Override
    public void start(Stage primaryStage) throws Exception {
        ObservableList<Integer> values = FXCollections.observableArrayList();
        values.addAll(1, 2, 3);


        TableColumn<Integer, Integer> tableColumn = new TableColumn<>("Column1");
        tableColumn.setCellValueFactory(param -> new ReadOnlyObjectWrapper<>(param.getValue()));


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

                    if (item == null) {
                        setText("");
                    } else {
                        setText(item.toString());
                    }
                }
            };
        });


        TableView<Integer> tableView = new TableView<>();
        tableView.setFixedCellSize(Region.USE_COMPUTED_SIZE);
        tableView.getColumns().add(tableColumn);
        tableView.setItems(values);

        tableView.setRowFactory(param -> {
            return new TableRow() {
                @Override
                public void updateIndex(int i) {
                    super.updateIndex(i);

                    setMinHeight(50 * i);
                }
            };
        });

        Scene scene = new Scene(tableView, 320, 480);

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

关于java - TableView 单元格自动换行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28782975/

相关文章:

java - 实现类的接口(interface)引用的序列化在反序列化时失败

java - 使用PreparedStatement进行批处理

java - 即使显式提供了模块路径,Eclipse 也找不到模块

java - 这是最小化绑定(bind)失效的有效方法吗?

java - 是否可以在不可修改的 ObservableSet 上注册 SetChangeListener?

java - 列出所有已部署的 REST 端点(spring-boot、jersey)

javafx Bindings.createStringBinding 但绑定(bind)实际上不起作用

JavaFX 使用 Ant 部署额外文件

java - javaFx中隐藏一些元素而不占用空间

java - 无法使用 AWS CodeDeploy 部署 Springboot 应用程序 AWS Ubuntu 实例