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