JavaFX - когда устанавливаются / обновляются widthProperty () и heightProperty () - PullRequest
0 голосов
/ 26 июня 2019

Я пытаюсь реализовать приложение перетаскивания, где пользователи могут перетаскивать новые «компоненты» на холст, а затем перетаскивать их. Вот код, который я использую для достижения этой цели:

В классе CanvasController

canvas.setOnDragDropped(new EventHandler<DragEvent>() {
  @Override
  public void handle(DragEvent event) {

    // Create new component
    ComponentController component = new ComponentController();

    // Add the component to the canvas
    canvas.getChildren().add(component);

    // Relocate the component to the mouse location
    component.relocateToPointInScene(new Point2D(event.getSceneX(),event.getSceneY()));

    // Make the component visible
    component.setVisible(true);

    // Set drop complete
    event.setDropCompleted(true);

    // Consume event
    event.consume();

  }
}

В классе ComponentController

protected final void relocateToPointInScene(Point2D scenePoint) {

  // Create a point in the parent (canvas) copordinates
  Point2D parentPoint = getParent().sceneToLocal(scenePoint);

  // Locate the node so that its centre is located at the parent point
  this.relocate((int) (parentPoint.getX() - (widthProperty().getValue()/2.0)), (int) (parentPoint.getY() - heightProperty().getValue()/2.0));

}

Функционально он работает нормально, но новый компонент не помещается в правильную точку на холсте - он должен быть расположен так, чтобы центр компонента находился в месте мыши, но вместо этого он был опущен так, чтобы верх левый угол находится на месте мыши.

Я понял, что это потому, что значения widthProperty () и heightProperty () нового компонента по-прежнему равны нулю при вызове relocateToPointInScene(Point2D scenePoint). Если я снова выберу компонент, перетащу его и снова уроню, код работает как положено, потому что теперь widthProperty () и heightProperty () не равны нулю.

canvas.setOnDragOver(new EventHandler<DragEvent>() {
  @Override
  public void handle(DragEvent event) {

    // Relocate the component to the mouse location
    component.relocateToPointInScene(new Point2D(event.getSceneX(),event.getSceneY()));

  }
}

Итак, мои вопросы:

  1. Почему widthProperty () и heightProperty () по-прежнему равны нулю при вызове в функции удаления? - На данный момент объект был сконструирован, инициализирован и добавлен к родителю (холст), поэтому я не понимаю, почему эти значения не должны быть установлены.

  2. Что происходит между первым и вторым вызовами relocateToPointInScene(Point2D scenePoint), чтобы изменить эти значения.

1 Ответ

1 голос
/ 26 июня 2019

Как предложил Slaw, вызов canvas.applyCss(), за которым следует canvas.layout(), после добавления компонента в качестве дочернего, но до его перемещения, делает свое дело.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...