2017-01-19 1 views
0

Je suis nouveau sur JavaFX et ce dont j'ai besoin est de détecter la position de la souris lorsque l'utilisateur glisse un fichier depuis l'extérieur de mon application, comme son OS. J'ai ajouté un écouteur pour dragEntered et dragExited, comme ceci:Demande de focus tout en faisant glisser de windows

EventHandler<MouseEvent> mouseMoved = new EventHandler<MouseEvent>() { 

    @Override 
    public void handle(MouseEvent event) { 
     logger.severe(event.getScreenX() + " : " + event.getScreenY()); 
    } 
}; 

scrollPane.setOnDragEntered(new EventHandler<DragEvent>() { 

    @Override 
    public void handle(DragEvent event) { 
     scrollPane.getScene().getWindow().requestFocus(); 
     scrollPane.requestFocus(); 
     event.consume(); 
     isDragging = true; 
     logger.severe(event.getScreenX() + " : " + event.getScreenY()); 
     scrollPane.addEventHandler(MouseEvent.MOUSE_MOVED, mouseMoved); 
    } 
}); 

scrollPane.setOnDragExited(new EventHandler<Event>() { 
    @Override 
    public void handle(Event event) { 
     isDragging = false; 
     event.consume(); 
     scrollPane.removeEventHandler(MouseEvent.MOUSE_MOVED, mouseMoved); 
    } 
}); 

scrollPane.setOnDragDropped(new EventHandler<Event>() { 
    @Override 
    public void handle(Event event) { 
     isDragging = false; 
     event.consume(); 
     scrollPane.removeEventHandler(MouseEvent.MOUSE_MOVED, mouseMoved); 
    } 
}); 

qui détecte avec succès que l'utilisateur est entré dans mon point de vue, en faisant glisser quelque chose, mais étant donné que l'utilisateur a cliqué en dehors de ma demande, mon nœud n'a pas le focus et je Je ne peux pas non plus requestFocus, puisque l'accent est mis sur le système d'exploitation. Je ne peux donc pas ajouter un MouseEventHandler sur mon nœud scrollPane pour détecter le déplacement de la souris. J'ai besoin de ceci pour implémenter le défilement intelligent, ainsi quand l'utilisateur traîne sur mon ScrollPane, il peut déplacer la souris au fond du Node et il défilera doucement.

Quelqu'un peut-il m'aider avec ce problème?

+1

Non testé, mais aide-t-il à demander d'abord le focus sur la fenêtre, c'est-à-dire 'scrollPane.getScene(). GetWindow(). RequestFocus()' avant d'appeler 'scrollPane.requestFocus()'? –

+0

Merci pour votre réponse. Cela change en effet le focus sur mon application (je vois sur ma barre des tâches), mais quand même, le gestionnaire d'événements pour MOUSE_MOVED ne fonctionne pas. – Robert

Répondre

0

Avec l'aide que je reçus de @James_D, je réussi à obtenir la position de la souris à tout mouvement, en utilisant setOnDragOver. Si quelqu'un a le même problème, voici comment mon code ressemble maintenant:

scrollPane.setOnDragEntered(new EventHandler<DragEvent>() { 

    @Override 
    public void handle(DragEvent event) { 
    scrollPane.getScene().getWindow().requestFocus(); 
    scrollPane.requestFocus(); 
    event.consume(); 
    isDragging = true; 

    } 
}); 

scrollPane.setOnDragOver(new EventHandler<DragEvent>() { 

    @Override 
    public void handle(DragEvent event) { 
    double windowHeight = scrollPane.getHeight(); 
    double topBar = (20*windowHeight)/100; 
    double bottomBar = windowHeight - topBar; 
    event.acceptTransferModes(TransferMode.LINK); 
    if(event.getY() > 0 && event.getY() < topBar && scrollPane.getVvalue() > 0) 
    scrollPane.setVvalue(scrollPane.getVvalue()-0.001); 
    else if(event.getY() < windowHeight && event.getY() > bottomBar && scrollPane.getVvalue() < 1) 
    scrollPane.setVvalue(scrollPane.getVvalue()+0.001); 
    } 

}); 

scrollPane.setOnDragExited(new EventHandler<Event>() { 
    @Override 
    public void handle(Event event) { 
    isDragging = false; 
    event.consume(); 
    } 
}); 

scrollPane.setOnDragDropped(new EventHandler<Event>() { 
    @Override 
    public void handle(Event event) { 
    isDragging = false; 
    event.consume(); 
    } 
}); 

Et cela donne un défilement intelligent, tout en faisant glisser, ce qui signifie que si vous faites glisser un fichier à partir d'OS (par exemple) dans l'application sur un scrollPane, si vous déplacez la souris sur les 20% inférieurs du scrollPane mentionné, il défilera lentement et même si vous déplacez la souris sur les 20% supérieurs du scrollPane - il défile vers le haut.

Nous vous remercions de votre aide et si vous avez d'autres commentaires, j'aimerais les lire.

0

Utilisation DragEvent au lieu de l'événement, par exemple:

scrollPane.setOnDragExited(new EventHandler<Event>() { 
     @Override 
     public void handle(Event event) { 
      event.consume(); 
      event.getScreenX(); // To get x position 
      event.getScreenY(); // To get y position 
      mouseOnTemplateBasker = false; 
      logger.severe("Exited dragging something"); 

     } 
    }); 
+0

Merci pour votre réponse. En effet, maintenant je peux obtenir la position X/Y de la souris mais seulement quand il quitte ma vue. J'ai besoin de eventHandler pour quand l'utilisateur déplace la souris - en faisant glisser - sur mon scrollPane. – Robert