JavaFX 2: Fenêtre d'outil contextuel déplaçable?


Je voudrais créer un contrôle contextuel déplaçable, qui est indépendant de sa fenêtre parente, et n'a pas la barre de titre du système.

J'ai essayé de réécrire l'exemple JavaFX pour les panneaux déplaçables afin de déplacer une étape non décorée en fonction des événements de la souris sur un nœud, voir le code ci-dessous. Malheureusement, cela ne semble pas fonctionner correctement, ce n'est pas lisse et saute autour de l'écran de manière erratique pour plusieurs écrans. J'ai lu que d'autres utilisaient des méthodes similaires, mais est-ce le seul façon de le faire actuellement ou quelqu'un a-t-il trouvé une bonne solution ? Merci,

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;
}
Author: JavaMonkey22, 2012-11-17

1 answers

J'ai utilisé cet exemple de méthode ci-dessous lors de la création d'une horloge .

Je ne l'ai testé que sur un seul écran, car je n'ai pas plusieurs écrans disponibles.

/** 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);
            }
        }
    });
}
 1
Author: jewelsea, 2012-11-17 10:49:16