JavaFX-何时设置/更新widthProperty()和heightProperty()

时间:2019-06-25 21:45:56

标签: java javafx drag-and-drop

我正在尝试实现一个拖放应用程序,用户可以在其中将新的“组件”拖放到画布上,然后将其拖放。这是我用来实现此目的的代码:

在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));

}

在功能上可以正常工作,但是新组件未放置在画布上的正确位置上-应该放置在新位置,以便组件的中心位于鼠标的位置,而应放下以便放置在顶部左角在鼠标位置。

我已经计算出这是因为在调用relocateToPointInScene(Point2D scenePoint)时,新组件的widthProperty()和heightProperty()的值仍为零。如果我将组件备份起来,请将其再次拖放,代码将按预期工作,因为现在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. 为什么在drop函数中调用widthProperty()和heightProperty()仍为零? -至此,对象已被构造,初始化并添加到父对象(画布),所以我不明白为什么不应该设置这些值。

  2. 在第一次和第二次调用relocateToPointInScene(Point2D scenePoint)来更改这些值之间发生了什么。

1 个答案:

答案 0 :(得分:1)

按照Slaw的建议,在将组件添加为子组件之后,但在重定位之前,先调用canvas.applyCss(),然后调用canvas.layout()