首页 > 解决方案 > JavaFX 表格单个行高,不能设置低值

问题描述

使用下面的代码,我想为 JavaFx 表的行高设置较低的值。但对我来说似乎有一个大约 25 的限制,更高的值会正确显示,但不会低于 25。

我可以setFixedCellSize(10)用来设置表的所有行。我有兴趣为单个行做这件事,所以我认为这应该在 TableCell 中完成,对吧?

有没有办法获得像 15 的行高?

import java.util.stream.IntStream;

import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.stage.Stage;

public class TableCellTest extends Application {

    public static void main(String[] args) {
        launch(args);
    }
    
    @Override public void start(Stage stage) throws Exception {
        int numCols = 20;
        int numRows = 20;
        
        ObservableList<Integer> rows = FXCollections.observableList(IntStream.rangeClosed(1, numRows).boxed().toList());
        TableView<Integer> tv = new TableView<>(rows);
        for (int i = 0; i < numCols; i++) {
            TableColumn<Integer, String> col = new TableColumn<>();
            col.setCellFactory(ts -> new TableCell<>() {
                {
                    setPrefHeight(10); //does not apply values below about 25
                }
            });
            tv.getColumns().add(col);
        }
        Scene scene = new Scene(tv, 900, 600);
        stage.setScene(scene);
        stage.show();
    }
}

行明显高于 10 像素

版本 2:

在这里,我尝试prefHeight对选定的行使用 TableRow 的集合,这是对我最初问题的答案,但副作用是现在表格下方有空白空间,并且实际 TableView 下方的那些空行甚至会改变它们的高度,如果我拖动列以重新排序。我无法访问这些行,因为它们超出了 TableView 的范围。不是令人满意的情况。

import java.util.stream.IntStream;

import javafx.application.Application;
import javafx.beans.property.SimpleStringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.stage.Stage;

public class TableCellTest3 extends Application {

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

    @Override public void start(Stage stage) throws Exception {
        int numCols = 20;
        int numRows = 20;

        ObservableList<Integer> rows = FXCollections.observableList(IntStream.rangeClosed(1, numRows).boxed().toList());
        TableView<Integer> tv = new TableView<>(rows);
        for (int i = 0; i < numCols; i++) {
            TableColumn<Integer, String> col = new TableColumn<>();
            int ii = i;
            col.setCellValueFactory(cdf -> new SimpleStringProperty(String.valueOf(ii)));
            col.setCellFactory(ts -> new TableCell<>() {

                @Override public void updateItem(String item, boolean empty) {
                    super.updateItem(item, empty);

                    if (item == null || empty) {
                        setText(null);

                    } else {
                        TableRow<Integer> row = getTableRow();
                        if (row != null) {
                            if (row.getItem() != null && row.getItem().intValue() < 10) {
                                row.setPrefHeight(15); //prefHeight of a row can be set low enough
                            } else {
                                row.setPrefHeight(25);
                            };
                        }
                        setText(item);
                    }
                }
            });
            tv.getColumns().add(col);
        }
        Scene scene = new Scene(tv, 900, 600);
        stage.setScene(scene);
        stage.show();
    }
}

桌子下方的奇怪空间

版本 3

将高度设置代码移动到 TableRow 的updateItem函数而不是 TableCell 的updateItem函数中也会在表格下方产生空白空间,尽管这次在拖动列时这些行不会改变它们的高度。似乎无论如何,设置prefHeightTableRow 会破坏对表格底部需要多少填充行的评估?这个值真的应该在“用户级别”处理吗?

import java.util.stream.IntStream;

import javafx.application.Application;
import javafx.beans.property.SimpleStringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.stage.Stage;

public class TableCellTest4 extends Application {

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

    @Override public void start(Stage stage) throws Exception {
        int numCols = 20;
        int numRows = 20;

        ObservableList<Integer> rows = FXCollections.observableList(IntStream.rangeClosed(1, numRows).boxed().toList());
        TableView<Integer> tv = new TableView<>(rows);
        for (int i = 0; i < numCols; i++) {
            TableColumn<Integer, String> col = new TableColumn<>();
            int ii = i;
            col.setCellValueFactory(cdf -> new SimpleStringProperty(String.valueOf(ii)));
            tv.getColumns().add(col);
        }
        tv.setRowFactory(tview -> new TableRow<Integer>() {
            
            @Override public void updateItem(Integer item, boolean empty) {
                super.updateItem(item, empty);
                if (item != null && item < 10) {
                    setPrefHeight(15);
                } else {
                    setPrefHeight(25);
                }
            }
        });
        Scene scene = new Scene(tv, 900, 600);
        stage.setScene(scene);
        stage.show();
    }
}

标签: javafx

解决方案


推荐阅读