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

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

  }
}


所以我的问题是:


为什么在放置函数中调用widthProperty()和heightProperty()仍为零? -至此,对象已被构造,初始化并添加到父对象(画布),所以我看不到为什么不应该设置这些值。
在第一次和第二次调用relocateToPointInScene(Point2D scenePoint)更改这些值之间发生了什么。

最佳答案

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

关于java - JavaFX-何时设置/更新widthProperty()和heightProperty(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56762442/

10-10 05:52