2

親ウィンドウから独立しており、システムのタイトル バーを持たない、ドラッグ可能なポップアップ コントロールを作成したいと考えています。

ノード上のマウスイベントに基づいて装飾されていないステージを移動するために、ドラッグ可能なパネルの 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;
}
4

1 に答える 1

2

時計を作るときは、以下のサンプルメソッドを使用しました。

複数の画面を使用できないため、1 つの画面でのみテストしました。

/** 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);
            }
        }
    });
}
于 2012-11-17T10:49:16.560 に答える