У меня есть StackPane, которую я могу перетаскивать по Панели (панель является родительским макетом панели стека), но в данный момент я могу перетащить ее из Панели. В настоящее время я не могу найти способ остановить перемещение StackPane на панель, когда она перетаскивается из панели.
Мой обработчик событий при нажатии на StackPane:
EventHandler<MouseEvent> circleOnMousePressedEventHandler =
new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent t) {
currentStackPane = ((StackPane)(t.getSource()));
orgSceneX = t.getSceneX();
orgSceneY = t.getSceneY();
layoutX = currentStackPane.getLayoutX();
layoutY = currentStackPane.getLayoutY();
}
};
Мой обработчик событий при перетаскивании StackPane:
EventHandler<MouseEvent> circleOnMouseDraggedEventHandler =
new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent t) {
double offsetX = t.getSceneX() - orgSceneX;
double offsetY = t.getSceneY() - orgSceneY;
currentStackPane.setTranslateX(offsetX);
currentStackPane.setTranslateY(offsetY);
}
};
Мой обработчик событий, когда я отпускаю мышь:
new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent t) {
currentStackPane.setLayoutX(layoutX + ((StackPane)(t.getSource())).getTranslateX());
currentStackPane.setLayoutY(layoutY + ((StackPane)(t.getSource())).getTranslateY());
currentStackPane.setTranslateX(0);
currentStackPane.setTranslateY(0);
}
};
return circleOnMouseReleaseEventHandler;
}
Есть ли способ, которым панель стека может быть перетаскиваемой только внутри панели.
Спасибо.
EDIT:
Что я пробовал:
Я создал этот метод:
private boolean outSideParentBounds( Bounds childBounds, double newX, double newY) {
Bounds parentBounds = centerPane.getLayoutBounds();
//check if too left
if( parentBounds.getMaxX() <= (newX + childBounds.getMaxX()) ) {
return true ;
}
//check if too right
if( parentBounds.getMinX() >= (newX + childBounds.getMinX()) ) {
return true ;
}
//check if too down
if( parentBounds.getMaxY() <= (newY + childBounds.getMaxY()) ) {
return true ;
}
//check if too up
if( parentBounds.getMinY() >= (newY + childBounds.getMinY()) ) {
return true ;
}
return false;
}
И мой обработчик событий перетаскивания теперь выглядит так:
EventHandler<MouseEvent> circleOnMouseDraggedEventHandler =
new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent t) {
double offsetX = t.getSceneX() - orgSceneX;
double offsetY = t.getSceneY() - orgSceneY;
if( outSideParentBounds(currentStackPane.getLayoutBounds(), layoutX + ((StackPane)(t.getSource())).getTranslateX(),
layoutY + ((StackPane)(t.getSource())).getTranslateY()) ) {
return;
}
currentStackPane.setTranslateX(offsetX);
currentStackPane.setTranslateY(offsetY);
}
};
Но, похоже, это не сработает, когда я перетаскиваю его из панели, оно просто застревает на краю панели, и вы больше не можете его перетаскивать.