Связывание строк 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);
  }

0 ответов

Другие вопросы по тегам