Drag and drop 鼠标拖动而不被按下?

Drag and drop 鼠标拖动而不被按下?,drag-and-drop,javafx,javafx-2,mouseevent,javafx-8,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) {

我有一个简单的方法可以使节点可拖动:

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);
}
private void setNodeDraggable(最终节点){
EventHandler dragHandler=新的EventHandler(){
私家车;
@重写公共无效句柄(MouseeEvent事件){

EventType您可以尝试另一种方法。我建议您在编写JavaFX程序时,更多地使用JavaFX库。忘记旧的标准。我知道这似乎很激进,但JavaFX库提供了开发丰富应用程序所需的一切

正如我告诉过你的,关于你的问题,我可以提供另一种方法。我不知道这是否符合你的喜好,但这是一种非常实用的方法。我的方法是创建两个类。一个作为实用类,并对节点进行逻辑移动,另一个将是你的主类。让我们先看看主类。在t在主类中,我们可以找到一种使任何节点都可移动的方法。我们利用在节点上添加两个事件来使其可移动。请看:

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);
            }
        }
    });
}
基本上就是这样。您现在所要做的就是在应用程序中使用这些代码。如果您对代码的某些逻辑仍有疑问,或者遇到问题,请添加注释,我将帮助您


我希望这对你有用。祝你在项目中好运。

使用JavaFX 2.2.45在win8上测试了你的代码。没有例外。你还应该指定你的环境和JavaFX的版本。@UlukBiy谢谢你的尝试。我只在局部得到异常,不是每次都得到异常-我在Win7 x64上使用Java 8 b119运行它。我在JavaFX 2.2.45和Jav上都尝试过一个8 b123,也无法生成异常。我尝试在另一个组件上启动完全拖动,看看这是否有什么不同。也许可以看看您是否可以创建一个完整(但简短)的示例显示了问题所在。也可以尝试创建一个ObjectProperty作为dragAnchor;然后您可以为mousePressed和MouseDraged创建不同的处理程序,但也可以向dragAnchor注册一个侦听器,以查看它何时更改。@James_D我在日志文件中发现了异常,但这种情况非常罕见,而且我无法系统地复制它-我可以在日志中看到它确实发生了…我会再试一次。无论如何,谢谢你的时间!谢谢你的回答-但说实话,我不认为这与我的方法有什么不同:你在一个单独的类中重构了pressNode/moveNode方法,但逻辑似乎与我相似。当我们和其他人在一起时,很难指出问题ers无法访问您的源代码。许多用户甚至评论说,他们在运行应用程序时没有遇到异常。如果引入您的代码最终显示了一些异常,我只能得出结论,您应该更新正在使用的JDK。
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 );
    }
}