【发布时间】:2014-11-21 03:38:02
【问题描述】:
我有一些代码可以让我拖动 StackPane 的一个实例。该代码在 JavaFX v2.2 中运行良好,但 StackPane 保持在默认位置并且在 JavaFX v8 中不会移动。
代码如下:
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");
}
});
}
我尝试将位置更新硬编码为测试,但也无法重新定位窗格。如果有人有任何想法,即使是最轻微的,我也很乐意尝试一下。我已经坚持了几天了。谢谢。
【问题讨论】:
标签: java drag-and-drop javafx javafx-2 javafx-8