textflow setstyle setfont font color javafx-2 stage

setstyle - Moviendo un escenario sin decorar en javafx 2



setstyle label javafx (5)

Basándome en la respuesta de jewelsea, hice dos expresiones lamba para establecer los MouseListeners directamente en la escena en mi método de inicio (). Funciona bien :)

private double xOffset; private double yOffset; /* The two following lambda expressions makes it possible to move the application without the standard StageStyle */ //Lambda mouse event handler scene.setOnMousePressed(event -> { xOffset = primaryStage.getX() - event.getScreenX(); yOffset = primaryStage.getY() - event.getScreenY(); }); //Lambda mouse event handler scene.setOnMouseDragged(event -> { primaryStage.setX(event.getScreenX() + xOffset); primaryStage.setY(event.getScreenY() + yOffset); });enter code here

He estado tratando de mover un escenario sin decorar alrededor de la pantalla, usando los siguientes dispositivos de escucha del mouse:

  • onPressed
  • onReleased
  • onDragged

Estos eventos son de un rectángulo. Mi idea es mover la ventana sin decorar haciendo clic en el rectángulo y arrastrando toda la ventana.

@FXML protected void onRectanglePressed(MouseEvent event) { X = primaryStage.getX() - event.getScreenX(); Y = primaryStage.getY() - event.getScreenY(); } @FXML protected void onRectangleReleased(MouseEvent event) { primaryStage.setX(event.getScreenX()); primaryStage.setY(event.getScreenY()); } @FXML protected void onRectangleDragged(MouseEvent event) { primaryStage.setX(event.getScreenX() + X); primaryStage.setY(event.getScreenY() + Y); }

Todo lo que tengo con estos eventos es cuando presiono el rectángulo y comienzo a arrastrar la ventana, se mueve un poco. Pero, cuando suelto el botón, la ventana se mueve hacia donde está el rectángulo.

Gracias por adelantado.


Estoy usando esta solución para arrastrar etapas no descritas al arrastrar cualquier nodo contenido.

private void addDraggableNode(final Node node) { node.setOnMousePressed(new EventHandler<MouseEvent>() { @Override public void handle(MouseEvent me) { if (me.getButton() != MouseButton.MIDDLE) { initialX = me.getSceneX(); initialY = me.getSceneY(); } } }); node.setOnMouseDragged(new EventHandler<MouseEvent>() { @Override public void handle(MouseEvent me) { if (me.getButton() != MouseButton.MIDDLE) { node.getScene().getWindow().setX(me.getScreenX() - initialX); node.getScene().getWindow().setY(me.getScreenY() - initialY); } } }); }


Mi conjetura es que tu:

onRectangleReleased()

está pasando las mismas coordenadas de tu

onRectanglePressed()

Esto sucede porque, como se indica en la documentación, el método getX () de la clase MouseEvent devuelve

Posición horizontal del evento en relación con el origen de la fuente de MouseEvent.

luego, cuando suelta el mouse, coloca su rectángulo en el lugar que tenía cuando presionó el primer mouse.

Por cierto, uso un StackPane con un rectángulo en el interior y luego aplico el siguiente código:

private void addDragListeners(final Node n){ n.setOnMousePressed(new EventHandler<MouseEvent>() { @Override public void handle(MouseEvent me) { if(me.getButton()!=MouseButton.MIDDLE) { initialX = me.getSceneX(); initialY = me.getSceneY(); } else { n.getScene().getWindow().centerOnScreen(); initialX = n.getScene().getWindow().getX(); initialY = n.getScene().getWindow().getY(); } } }); n.setOnMouseDragged(new EventHandler<MouseEvent>() { @Override public void handle(MouseEvent me) { if(me.getButton()!=MouseButton.MIDDLE) { n.getScene().getWindow().setX( me.getScreenX() - initialX ); n.getScene().getWindow().setY( me.getScreenY() - initialY); } } }); } addDragListeners(mainStackPane);

Además de eso, uso el botón central del ratón para centrar mi ventana en la pantalla. Esperaba que ayudara. ¡Aclamaciones!


Creé una sample de un reloj animado en una ventana sin decorar que puedes arrastrar.

El código relevante de la muestra es:

// allow the clock background to be used to drag the clock around. final Delta dragDelta = new Delta(); layout.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(); } }); layout.setOnMouseDragged(new EventHandler<MouseEvent>() { @Override public void handle(MouseEvent mouseEvent) { stage.setX(mouseEvent.getScreenX() + dragDelta.x); stage.setY(mouseEvent.getScreenY() + dragDelta.y); } }); ... // records relative x and y co-ordinates. class Delta { double x, y; }

El código se parece bastante al suyo, por lo que no estoy seguro de por qué su código no funciona para usted.


double x, y; private void addDragListeners(final Node n, Stage primaryStage){ n.setOnMousePressed((MouseEvent mouseEvent) -> { this.x = n.getScene().getWindow().getX() - mouseEvent.getScreenX(); this.y = n.getScene().getWindow().getY() - mouseEvent.getScreenY(); }); n.setOnMouseDragged((MouseEvent mouseEvent) -> { primaryStage.setX(mouseEvent.getScreenX() + this.x); primaryStage.setY(mouseEvent.getScreenY() + this.y); }); } public void start(Stage primaryStage) { try { ... addDragListeners(mainPane, primaryStage); } catch (Exception e) { e.printStackTrace(System.out); } }