java - JavaFx 修复表行
问题描述
我没有找到修复 tableView/treeTableView 中的列的答案的问题。
我想对表中的行做同样的事情,但应用相同的想法我无法实现任何目标。
对于列,想法是将单元格的 X 位置固定为滚动。
所以我对行尝试了同样的事情,而是将它们的 Y 位置固定为垂直滚动,但似乎什么也没发生。
这是您可以检查的代码:
Controller.java
:
public class Controller implements Initializable {
@FXML
private TreeTableView<Model> table;
@FXML
private TreeTableColumn<Model, String> col;
@Override
public void initialize(URL location, ResourceBundle resources) {
col.setCellValueFactory(data -> data.getValue().getValue().text);
setup();
table.skinProperty().addListener((observable, oldValue, newValue) -> {
if (newValue != null) {
TreeTableRow<Model> firstRow = (TreeTableRow<Model>) table
.queryAccessibleAttribute(AccessibleAttribute.ROW_AT_INDEX, 0);
ScrollBar scrollBar = (ScrollBar) table
.queryAccessibleAttribute(AccessibleAttribute.VERTICAL_SCROLLBAR);
scrollBar.valueProperty().addListener((obs, oV, nV) -> {
firstRow.toFront();
System.out.println("norm: " + nV); // debug
double value = convert(nV.doubleValue(), 0, table.getHeight()) / 2;
System.out.println("non-norm: " + value); // debug
firstRow.setTranslateY(value);
});
}
});
}
private void setup() {
table.setShowRoot(false);
table.setRoot(new TreeItem<>());
Model r1 = new Model("A");
Model r2 = new Model("B");
Model r11 = new Model("A1");
Model l1 = new Model("Ba");
Model l2 = new Model("Bb");
TreeItem<Model> ti = new TreeItem<>(r2);
ti.getChildren().add(new TreeItem<>(l1));
ti.getChildren().add(new TreeItem<>(l2));
table.getRoot().getChildren().add(new TreeItem<>(r11));
table.getRoot().getChildren().add(ti);
table.getRoot().getChildren().add(new TreeItem<>(r1));
table.getRoot().getChildren().add(new TreeItem<>(r1));
table.getRoot().getChildren().add(new TreeItem<>(r1));
table.getRoot().getChildren().add(new TreeItem<>(r1));
table.getRoot().getChildren().add(new TreeItem<>(r1));
table.getRoot().getChildren().add(new TreeItem<>(r1));
table.getRoot().getChildren().add(new TreeItem<>(r1));
table.getRoot().getChildren().add(new TreeItem<>(r1));
table.getRoot().getChildren().add(new TreeItem<>(r1));
table.getRoot().getChildren().add(new TreeItem<>(r1));
table.getRoot().getChildren().add(new TreeItem<>(r1));
table.getRoot().getChildren().add(new TreeItem<>(r1));
table.getRoot().getChildren().add(new TreeItem<>(r1));
table.getRoot().getChildren().add(new TreeItem<>(r1));
table.getRoot().getChildren().add(new TreeItem<>(r1));
table.getRoot().getChildren().add(new TreeItem<>(r1));
}
private double convert(double val, double min, double max) {
return val * (max - min) + min;
}
public static class Model {
private StringProperty text;
public Model(String text) {
this.text = new SimpleStringProperty(text);
}
public StringProperty textProperty() {
return text;
}
}
}
View.fxml
:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.TreeTableColumn?>
<?import javafx.scene.control.TreeTableView?>
<?import javafx.scene.layout.StackPane?>
<StackPane xmlns="http://javafx.com/javafx"
xmlns:fx="http://javafx.com/fxml"
fx:controller="stackoverflow.fixrow.Controller">
<TreeTableView fx:id="table">
<columns>
<TreeTableColumn fx:id="col" prefWidth="200"/>
</columns>
</TreeTableView>
</StackPane>
经过一段时间的调试,我发现垂直滚动的值与水平滚动的值不同。垂直滚动具有标准化值,所以我认为这是我试图使用标准化值的问题,这就是它不起作用的原因,但是在将其转换回实际值之后似乎发生了同样的事情,所以什么也没有。
知道我错过了什么,或者为什么不像在专栏中那样工作?
当然,我将不胜感激任何其他可行的解决方案。
注意:这里我有一个TreeTableView
,因为目前我需要它,但我认为相同的解决方案可以应用于TV
两者TTV
解决方案
推荐阅读
- python - Python ValueError:无法将字符串转换为浮点数
- python - 仅当行值满足 Python 中的特定条件时,才在 Pandas 数据框中选择列名
- asp.net-mvc - 使用 Visual Studio 从 Blazor 中的模型生成视图/页面
- javascript - 不断得到“未定义”但是我尝试用javascript解析geojson文件
- mysql - 我如何才能获得每个工作的每个阶段的最后一行?
- javascript - 从 Laravel 刀片中的 js 文件访问对象?
- tensorflow - Tensorflow Serving:在基本路径 /models 下找不到可服务的 half_plus_two 的版本
- javascript - 这个while循环有什么问题?
- r - 我是新来的。我试图通过使用 for 循环使我的代码不那么复杂
- java - Java double - 某些小数位后只有零