我有一些代碼可以讓我拖動一個StackPane的實例。該代碼在JavaFX v2.2中正常工作,但StackPane保持默認位置,並且不會在JavaFX v8中移動。爲什麼我的JavaFX應用程序的拖動例程在JavaFX 8中中斷?
下面是代碼:
private void initDragRoutine(final Node source,
final boolean replaceSource,
final Node replaceWith,
final Pane replaceFrom)
{
/*
* add the draggable pane and create its text
*/
source.setOnDragDetected(new EventHandler<MouseEvent>()
{
@Override
public void handle(MouseEvent mouseEvent)
{
System.out.println("drag initialized");
//update the content of the draggable instance with that of the fixed position source
if (mouseEvent.getSource() instanceof StringPane)
draggablePane.setOverlay(((StringPane) mouseEvent.getSource()).getOverlay());
//update position
Point2D localPoint = questionInfoNode.sceneToLocal(
new Point2D(mouseEvent.getSceneX(), mouseEvent.getSceneY()));
draggablePane.relocate(
(int) (localPoint.getX() - draggablePane.getBoundsInLocal().getWidth()/2),
(int) (localPoint.getY() - draggablePane.getBoundsInLocal().getHeight()/2)
);
//add to scene
styledRootNode.getChildren().add(draggablePane);
draggablePane.startFullDrag();
//replace source
if (replaceSource && replaceFrom != null)
for (int index = 0; index < replaceFrom.getChildren().size(); index++)
if (replaceFrom.getChildren().get(index) == source)
replaceFrom.getChildren().set(index, replaceWith);
mouseEvent.consume();
}
});
/*
* update the position
*/
source.setOnMouseDragged(new EventHandler<MouseEvent>()
{
@Override
public void handle(MouseEvent mouseEvent)
{
System.out.println("dragged");
//update position
Point2D localPoint = questionInfoNode.sceneToLocal(
new Point2D(mouseEvent.getSceneX(), mouseEvent.getSceneY()));
System.out.println("x" + mouseEvent.getSceneX() + "y" + mouseEvent.getSceneY());
draggablePane.relocate(
(int) (localPoint.getX() - draggablePane.getBoundsInLocal().getWidth()/2),
(int) (localPoint.getY() - draggablePane.getBoundsInLocal().getHeight()/2)
);
//draggablePane.relocate(450, 1000);
//source.setCursor(Cursor.NONE);
mouseEvent.consume();
}
});
/*
* adjust cursor on entry
*/
source.setOnMouseEntered(new EventHandler<MouseEvent>()
{
public void handle(MouseEvent e)
{
source.setCursor(Cursor.HAND);
e.consume();
}
});
/*
* adjust cursor on pressed
*/
source.setOnMousePressed(new EventHandler<MouseEvent>()
{
public void handle(MouseEvent e)
{
System.out.println("mouse pressed");
source.setMouseTransparent(true);
draggablePane.setMouseTransparent(true);
source.setCursor(Cursor.CLOSED_HAND);
e.consume();
System.out.println("mouse pressed done");
}
});
/*
* adjust cursor on released
*/
source.setOnMouseReleased(new EventHandler<MouseEvent>()
{
public void handle(MouseEvent e)
{
System.out.println("mouse released");
source.setMouseTransparent(false);
draggablePane.setMouseTransparent(false);
source.setCursor(Cursor.DEFAULT);
styledRootNode.getChildren().remove(draggablePane);
e.consume();
System.out.println("mouse released done");
}
});
}
我試過只是硬編碼作爲測試,也不能重新定位窗格的位置更新。如果有人有任何想法,即使有絲毫的想法,我也想嘗試一下。我一直堅持這幾天。謝謝。