2017-10-05 3 views
1

Ich hoffe, dass jemand mir mit einem kleinen Problem helfen kann. Ich versuche, den Standort meiner Maus über den Bildschirm zu verfolgen, was ich problemlos tun konnte. Wenn es jedoch über eine Schaltfläche hinausgeht, hört es auf zu verfolgen. Hat jemand eine Idee, wie ich das beheben könnte? Hier ist ein triviales Beispiel für das umfassendere Problem, das ich versuche zu arbeiten:JavaFX-Taste macht Mausereignis verschwinden

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

Vielen Dank im Voraus!

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

Antwort

-1

neue Maus bewegen Ereignis für Taste auch, wenn Sie verfolgen möchten hinzufügen:

+0

Vielen Dank! –

2

Mit der Maus Event-Handler und erhalten x und y mit event.getSceneX() und event.getSceneY() -Methode wie so bewegt die Mauszeigerposition über die Taste auch

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

Dies gibt Ihnen die Koordinate in Bezug auf die Schaltfläche. Und wenn Sie die Position (Koordinaten) in Bezug auf Szene wollen, dann verwenden

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

Vielen Dank! Solch eine einfache Lösung für etwas, das ich seit Tagen nicht reparieren konnte, haha ​​ –

+0

Immer WC! @AngiePinchbeck –

0

Die Anwendung stoppt die Verfolgung der Maus-Ereignis, da die Standard (und erwartete) Verhalten für die Kontrollen ist es, alle Mausereignisse verbrauchen sie erhalten. Das heißt, diese Mausereignisse werden daran gehindert, an ihre Eltern zu sprudeln (Event Delivery Process). Damit hört der Szenenknoten (und alle anderen übergeordneten Knoten der Schaltfläche) auf, Mausereignisse immer dann zu empfangen, wenn eine Mausaktion auf der Schaltfläche ausgeführt wird.

Eine andere Lösung wäre, ein Ereignisfilter zu verwenden, da Filter während der Ereignis-Erfassungsphase und somit aufgerufen werden, bevor die internen Ereignishandler JavaFX die Mausereignisse für Kontrollen verbraucht:

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