2012-08-02 9 views
18

ho cercato di spostare una fase non decorato intorno allo schermo, utilizzando i seguenti ascoltatori del mouse:Spostamento di un palco decorato in JavaFX 2

  • onPressed
  • onReleased
  • onDragged

Questi eventi provengono da un rettangolo. La mia idea è quella di spostare la finestra non decorata cliccando sul rettangolo e trascinando tutta la finestra.

 
@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); 
} 

Tutto quello che ho con questi eventi è quando si preme il rettangolo e inizio a trascinare la finestra, si muove un po '. Ma quando rilascio il pulsante, la finestra viene spostata nel punto in cui si trova il rettangolo.

Grazie in anticipo.

+0

Non è necessario gestire l'evento suRectangleReleased. –

risposta

17

Ho creato un sample di un orologio animato in una finestra non decorata che è possibile trascinare.

codice rilevante dal campione è:

// 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; } 

codice sembra piuttosto simile al vostro, in modo non del tutto sicuro perché il codice non funziona per voi.

+0

Sì, è praticamente lo stesso.alla fine ho trovato la soluzione, il mio errore era usare l'evento sbagliato. Stavo usando il generatore di scene. Ma implementando il setOnMouseDragged, tutto diventa perfetto. Grazie! –

+0

Ho notato che questo metodo ha una frequenza di aggiornamento inferiore rispetto al trascinamento della finestra di sistema. Vorrei sapere come utilizzare il riposizionatore di posizione della finestra di sistema. – Pathfinder

+0

fase di impostazione a undecorated rimuove finestra 10 supporto per ridimensionamento bordo rapido – Pathfinder

3

La mia ipotesi è che il vostro:

onRectangleReleased() 

sta passando le stesse coordinate dal

onRectanglePressed() 

Ciò accade perché, come indicato nella documentazione del metodo GetX() dai rendimenti classe MouseEvent

Posizione orizzontale dell'evento relativo all'origine dello Mous La fonte di eEvent.

quindi, quando si rilascia il mouse, il rettangolo viene effettivamente posizionato nel punto in cui si trovava al primo clic del mouse.

BTW, io uso uno StackPane con un rettangolo all'interno e quindi applicare il seguente codice:

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); 

Oltre a questo, io uso il pulsante centrale del mouse per centrare la mia finestra sullo schermo. Speravo che mi aiutasse. Saluti!

+0

Grazie. Stavo creando la GUI con il generatore di scene e stavo usando l'evento di trascinamento sbagliato. Implemento onMouseDragged e tutti i lavori. Grazie! –

13

Sto usando questa soluzione per il trascinamento di stadi non decodificati trascinando qualsiasi nodo contenuto.

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); 
      } 
     } 
    }); 
} 
1
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); 
    } 

} 
1

Sulla base di risposta di jewelsea ho fatto due espressioni Lamba per impostare le MouseListeners direttamente sulla scena nel metodo() il mio inizio. Funziona bene :)

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 
Problemi correlati