2017-10-05 12 views
1

J'espère que quelqu'un pourra m'aider avec un petit problème. J'essaie de suivre l'emplacement de ma souris sur l'écran, ce que je n'ai pas réussi à faire. Cependant, quand il va sur un bouton, il arrête le suivi. Est-ce que quelqu'un a une idée de comment je pourrais résoudre ce problème? Voici un exemple trivial du problème plus large que j'essaie de travailler:Le bouton JavaFX fait disparaître l'événement souris

double x, y; 

public static void main(String[] args) { 
    Application.launch(args); 
} 

@Override 
public void start(Stage pStage) { 

    BorderPane bp = new BorderPane(); 

    Scene scene = new Scene(bp, 500, 500); 

    pStage.setTitle("Show Circle"); 
    pStage.setScene(scene); 
    pStage.show(); 

    VBox centre = new VBox(); 
    centre.setAlignment(Pos.CENTER); 
    centre.setPadding(new Insets(20, 20, 20, 20)); 

    Button btn = new Button("hello"); 
    centre.setPadding(new Insets(10, 10, 10, 10)); 

    Label info = new Label("x: " + x + "\ny: " + y); 
    info.setPadding(new Insets(10, 10, 10, 10)); 
    info.setFont(Font.font("Courier New", FontWeight.BOLD, 18)); 

    centre.getChildren().addAll(info, btn); 
    bp.setCenter(centre); 

    x = 0; 
    y = 0; 

    scene.setOnMouseMoved(e -> { 
     x = e.getX(); 
     y = e.getY(); 
     info.setText("x: " + x + "\ny: " + y); 
    }); 
} 

Merci d'avance!

Répondre

-1

Ajouter un nouvel événement de déplacement de la souris pour le bouton aussi si vous voulez suivre la position du curseur de la souris sur le bouton aussi

 btn.setOnMouseMoved(e -> { 
      x = e.getX(); 
      y = e.getY(); 
      info.setText("x: " + x + "\ny: " + y); 
     }); 

cela vous donnera les coordonnées par rapport au bouton. Et si vous voulez la position (coordonnées) à l'égard de la scène puis utilisez

 x = e.getSceneX(); 
     y = e.getSceneY(); 
+0

Merci beaucoup! –

2

Utilisez gestionnaire d'événements déplacé souris et obtenir x et y en utilisant la méthode event.getSceneX() et event.getSceneY() comme comme:

btn.setOnMouseMoved(new EventHandler<MouseEvent>() { 
     @Override 
     public void handle(MouseEvent t) { 
      x = t.getSceneX(); 
      y = t.getSceneY(); 
      info.setText("x: " + x + "\ny: " + y); 
     } 
}); 
+0

Merci beaucoup! Une telle solution facile pour quelque chose que je n'ai pas été capable de réparer pendant des jours, haha ​​ –

+0

Toujours WC! @AngiePinchbeck –

0

L'application arrête le suivi de l'événement de la souris, car la valeur par défaut (et attendu) le comportement des contrôles est de consommer tous les événements de la souris qu'ils reçoivent. C'est-à-dire, ces événements de souris sont empêchés de bouillir (Event Delivery Process) à leurs parents. Avec ceci, le nœud de scène (et tous les autres nœuds parents du bouton) arrête de recevoir des événements de souris chaque fois qu'une action de souris est effectuée sur le bouton.

Une autre solution serait d'utiliser un filtre d'événements, car les filtres sont appelés lors de l'événement de phase de capture et donc avant gestionnaire d'événements interne du JavaFX consomme les événements de souris pour les contrôles:

scene.addEventFilter(MouseEvent.MOUSE_MOVED, event -> { 
    x = event.getSceneX(); 
    y = event.getSceneY(); 
    info.setText("x: " + x + "\ny: " + y); 
});