popup - JavaFX 2 : Draggable popup tool window?

标签 popup draggable javafx-2 stage

我想做一个可拖动的弹出控件,它独立于其父窗口,并且没有系统的标题栏。

我尝试重写可拖动面板的 JavaFx 示例,以便根据节点上的鼠标事件移动未装饰的舞台,请参见下面的代码。不幸的是,这似乎无法正常工作,它不流畅,并且在多个屏幕上不稳定地在屏幕上跳跃。我读到其他一些人使用了类似的方法,但是这是目前唯一的方法还是有人找到了一个好的解决方案? 谢谢,

private Node makeDraggable(final Node node) {
    final DragContext dragContext = new DragContext();
    final Node wrapGroup = node;

    wrapGroup.addEventFilter(
            MouseEvent.MOUSE_PRESSED,
            new EventHandler<MouseEvent>() {
                public void handle(final MouseEvent mouseEvent) {

                        dragContext.mouseAnchorX = mouseEvent.getX();
                        dragContext.mouseAnchorY = mouseEvent.getY();
                        dragContext.initialTranslateX =
                                stage.getX();
                        dragContext.initialTranslateY =
                                stage.getY();
                    }

            });

    wrapGroup.addEventFilter(
            MouseEvent.MOUSE_DRAGGED,
            new EventHandler<MouseEvent>() {
                public void handle(final MouseEvent mouseEvent) {

                        stage.setX(
                                dragContext.initialTranslateX
                                        + mouseEvent.getX()
                                        - dragContext.mouseAnchorX);
                        stage.setY(
                                dragContext.initialTranslateY
                                        + mouseEvent.getY()
                                        - dragContext.mouseAnchorY);
                    dragContext.initialTranslateX =
                            stage.getX();
                    dragContext.initialTranslateY =
                            stage.getY();

                }
            });

    return node;
}

最佳答案

我在制作 clock 时使用了下面的示例方法.

我只在一个屏幕上进行了测试,因为我没有多个屏幕可用。

/** holder structure for drag delta amounts */
private static class Delta { double x, y; }

/** makes a stage draggable using a given node */
public static void makeDraggable(final Stage stage, final Node byNode) {
    final Delta dragDelta = new Delta();
    byNode.setOnMousePressed(new EventHandler<MouseEvent>() {
        @Override public void handle(MouseEvent mouseEvent) {
            // record a delta distance for the drag and drop operation.
            dragDelta.x = stage.getX() - mouseEvent.getScreenX();
            dragDelta.y = stage.getY() - mouseEvent.getScreenY();
            byNode.setCursor(Cursor.MOVE);
        }
    });
    byNode.setOnMouseReleased(new EventHandler<MouseEvent>() {
        @Override public void handle(MouseEvent mouseEvent) {
            byNode.setCursor(Cursor.HAND);
        }
    });
    byNode.setOnMouseDragged(new EventHandler<MouseEvent>() {
        @Override public void handle(MouseEvent mouseEvent) {
            stage.setX(mouseEvent.getScreenX() + dragDelta.x);
            stage.setY(mouseEvent.getScreenY() + dragDelta.y);
        }
    });
    byNode.setOnMouseEntered(new EventHandler<MouseEvent>() {
        @Override public void handle(MouseEvent mouseEvent) {
            if (!mouseEvent.isPrimaryButtonDown()) {
                byNode.setCursor(Cursor.HAND);
            }
        }
    });
    byNode.setOnMouseExited(new EventHandler<MouseEvent>() {
        @Override public void handle(MouseEvent mouseEvent) {
            if (!mouseEvent.isPrimaryButtonDown()) {
                byNode.setCursor(Cursor.DEFAULT);
            }
        }
    });
}

关于popup - JavaFX 2 : Draggable popup tool window?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13429437/

相关文章:

Android:从选项菜单打开自定义弹出对话框

javascript - 在弹出窗口中管理 Html 文本

javascript - ASP.NET 中带有确认框的弹出窗口

javascript - 如何通过拖动图像来调整 div 大小?

javascript - 我们如何限制用户单击或继续浏览器窗口,直到他们关闭打开的弹出窗口?

javascript - 如何在拖动时隐藏可拖动div的阴影

javascript - HTML 拖放持久化

javafx-2 - 如何在JAVAFX中使用带有动态列的动态TableView编辑数据

java - 我如何在 netbeans 中使用 javafx 2.0 调色板?

JavaFX : After setting text in textArea, 在单独的线程中设置滚动到底部不起作用