javafx - 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();
}
}
版本 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
函数中也会在表格下方产生空白空间,尽管这次在拖动列时这些行不会改变它们的高度。似乎无论如何,设置prefHeight
TableRow 会破坏对表格底部需要多少填充行的评估?这个值真的应该在“用户级别”处理吗?
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();
}
}
解决方案
推荐阅读
- python - Python:创建具有类似 Xor 行为的集合
- python - 如何根据两个日期时间列的不同条件在 Pandas 中提取行
- web-applications - 从服务器更新客户端数据的最佳方法
- php - PHP Discord oauth:试图获取非对象的属性'access_token'
- archlinux - Arch linux OS 上的 Sublime 文本
- python - 3-Line --> triangle --> 3-inequality 我想转换
- python-3.x - Python for 循环只迭代一次
- ngx-bootstrap - datepicker 每月最后一天的样式
- localization - 如何根据使用 gatsby-theme-i18n-react-i18next 选择的语言更改 url 中的 slug?
- visual-studio-code - 替换 VSCode 中的现有选项卡