Связывание строк TreeCell не работает при прокрутке
У меня есть два TreeView в моем графическом интерфейсе JavaFX, которые я заполняю динамически. У них может быть много данных, поэтому в большинстве случаев они будут прокручиваемыми. После этого я создаю соединения (или, скорее, ребра) между TreeCell обоих TreeView. Я рисую линию от исходной ячейки к целевой и создаю привязки. Мой код для этого следующий:
line.startYProperty().bind(Bindings.createDoubleBinding(() -> {
Bounds b = sourceCell.getBoundsInParent();
return b.getMaxY() + b.getHeight() / 2;
}, sourceCell.boundsInParentProperty()));
line.endYProperty().bind(Bindings.createDoubleBinding(() -> {
Bounds b = targetCell.getBoundsInParent();
return b.getMaxY() + b.getHeight() / 2;
}, targetCell.boundsInParentProperty()));
Теперь это работает для меня, пока я не начну прокручивать один из TreeView. Когда связанная ячейка прокручивается за пределы видимой области древовидной структуры, позиция строки сбрасывается и соединяется с другой ячейкой.
Я решил, что это связано с тем, что привязка связана с TreeCell, и они могут динамически изменять свое значение в зависимости от видимых данных, но какова альтернатива, чтобы заставить его работать?
Как мне сохранить привязку линии к исходному TreeCell, чтобы она не менялась при прокрутке назад и обратно в представление?
Мой пример кода:
@Override
public void start(Stage primaryStage) {
try {
AnchorPane root = new AnchorPane();
Scene scene = new Scene(root, 700, 400);
primaryStage.setScene(scene);
primaryStage.show();
TreeItem sourceRoot = new TreeItem("source");
sourceRoot.setExpanded(true);
TreeItem targetRoot = new TreeItem("target");
targetRoot.setExpanded(true);
TreeView<String> source = new TreeView<String>(sourceRoot);
TreeView<String> target = new TreeView<String>(targetRoot);
target.setLayoutX(400.0);
root.getChildren().add(source);
root.getChildren().add(target)
// fill and randomly select two visible cells
for (int i = 0; i < 100; i++) {
sourceRoot.getChildren().add(new TreeItem("ItemS " + i));
targetRoot.getChildren().add(new TreeItem("ItemT " + i));
}
TreeCell<String> sourceCell = (TreeCell<String>) source.lookupAll(".tree-cell").toArray()[2];
TreeCell<String> targetCell = (TreeCell<String>) target.lookupAll(".tree-cell").toArray()[4];
Line line = new Line();
line.setStartX(source.getWidth());
line.startYProperty().bind(Bindings.createDoubleBinding(() -> {
Bounds b = sourceCell.getBoundsInParent();
return b.getMinY() + b.getHeight() / 2;
}, sourceCell.boundsInParentProperty()));
line.setEndX(target.getLayoutX());
line.endYProperty().bind(Bindings.createDoubleBinding(() -> {
Bounds b = targetCell.getBoundsInParent();
return b.getMinY() + b.getHeight() / 2;
}, targetCell.boundsInParentProperty()));
root.getChildren().add(line);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
launch(args);
}