Я пытаюсь реализовать приложение перетаскивания, где пользователи могут перетаскивать новые «компоненты» на холст, а затем перетаскивать их. Вот код, который я использую для достижения этой цели:
В классе 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()));
}
}
Итак, мои вопросы:
Почему widthProperty () и heightProperty () по-прежнему равны нулю при вызове в функции удаления? - На данный момент объект был сконструирован, инициализирован и добавлен к родителю (холст), поэтому я не понимаю, почему эти значения не должны быть установлены.
Что происходит между первым и вторым вызовами relocateToPointInScene(Point2D scenePoint)
, чтобы изменить эти значения.