Я не нашел вопрос, где я получил ответ для исправления столбцов в tableView / treeTableView.
Я хотел бы сделать то же самое для строк в таблице, но, применяя ту же идею, мне ничего не удалось достичь.
Для столбцов идея заключалась в том, чтобы исправить ячейки'Положение X для прокрутки.
Так что я попробовал то же самое со строками, но вместо этого зафиксировал их положение Y для вертикальной прокрутки, но, похоже, ничего не произошло.
Вот код, который вы можетеcheck:
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