我有这个简单的方法来使节点可拖动:
private void setNodeDraggable(final Node node) {
EventHandler<MouseEvent> dragHandler = new EventHandler<MouseEvent>() {
private Point2D dragAnchor;
@Override public void handle(MouseEvent event) {
EventType<? extends MouseEvent> type = event.getEventType();
if (type == MOUSE_PRESSED) {
dragAnchor = new Point2D(event.getSceneX(), event.getSceneY());
} else if (type == MOUSE_DRAGGED) {
try {
stage.setX(event.getScreenX() - dragAnchor.getX());
stage.setY(event.getScreenY() - dragAnchor.getY());
} catch (Exception e) { ///catch all to track the occasional exception
LOG.error("in setNodeDraggable: {},{},{}", stage, event, dragAnchor);
}
}
}
};
node.setOnMouseDragged(dragHandler);
node.setOnMousePressed(dragHandler);
}
但是,try块中会不时抛出异常,并且日志显示dragAnchor
为空。
据我所知,唯一的解释是在没有相应的先前MOUSE_DRAGGED
事件的情况下检测到MOUSE_PRESSED
。
怎么可能?有什么我应该改变的吗?
答案 0 :(得分:0)
您可以尝试其他方法。我建议你在编写JavaFX程序时,更多地依赖JavaFX库。忘记旧标准。我知道这看起来很激进,但JavaFX库提供了开发丰富应用程序所需的一切。
正如我告诉过你的,关于你的问题,我可以为你提供另一种方法。我不知道它是否符合你的喜好,但它是一种非常实用的方法。我的方法是创建两个类。一个将作为实用程序类,并使节点的逻辑运动,另一个将是您的主类。我们先来看看主要课程。在主类中,我们可以找到一个使任何Node可移动的方法。我们在我们想要移动的节点上添加两个事件。看看:
protected void makeMovable(final Node node)
{
node.addEventHandler(MouseEvent.MOUSE_PRESSED , new EventHandler<MouseEvent>()
{
@Override public void handle(MouseEvent e)
{
// Just move node if the mouse button is the left button.
if(e.getButton() == MouseButton.PRIMARY)
{
NodeUtil.pressNode(node , e);
}
}
});
node.addEventHandler(MouseEvent.MOUSE_DRAGGED , new EventHandler<MouseEvent>()
{
@Override public void handle(MouseEvent e)
{
// Just move node if the mouse button is the left button.
if(e.getButton() == MouseButton.PRIMARY)
{
NodeUtil.moveNode(node , e);
}
}
});
}
在这段代码中,正如您所看到的,它只是为makeMovable方法上的node参数添加了某些类型事件的处理程序。可以在NodeUtil类中找到Node对象真实移动的逻辑:
public final class NodeUtil
{
private static double dist_x = 0;
private static double dist_y = 0;
private NodeUtil(){}
public static void pressNode(final Node node , final MouseEvent e)
{
dist_x = e.getSceneX() - node.getLayoutX();
dist_y = e.getSceneY() - node.getLayoutY();
}
public static void moveNode(final Node node , final MouseEvent e)
{
node.setLayoutX( e.getSceneX() - dist_x );
node.setLayoutY( e.getSceneY() - dist_y );
}
}
基本上就是这样。您现在必须做的就是在您的应用程序中使用这些代码。如果您对代码的某些逻辑仍有疑问或遇到问题,请添加评论,我会帮助您。
我希望这适合你。祝你的项目好运。 ;)