我正在尝试实现一个拖放应用程序,用户可以在其中将新的“组件”拖放到画布上,然后将其拖放。这是我用来实现此目的的代码:
在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()));
}
}
所以我的问题是:
为什么在drop函数中调用widthProperty()和heightProperty()仍为零? -至此,对象已被构造,初始化并添加到父对象(画布),所以我不明白为什么不应该设置这些值。
在第一次和第二次调用relocateToPointInScene(Point2D scenePoint)
来更改这些值之间发生了什么。
答案 0 :(得分:1)
按照Slaw的建议,在将组件添加为子组件之后,但在重定位之前,先调用canvas.applyCss()
,然后调用canvas.layout()
。