拖动鼠标没有被按下?

时间:2014-02-05 08:16:16

标签: drag-and-drop javafx javafx-2 mouseevent javafx-8

我有这个简单的方法来使节点可拖动:

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

怎么可能?有什么我应该改变的吗?

1 个答案:

答案 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 );
    }
}

基本上就是这样。您现在必须做的就是在您的应用程序中使用这些代码。如果您对代码的某些逻辑仍有疑问或遇到问题,请添加评论,我会帮助您。

我希望这适合你。祝你的项目好运。 ;)