2017-10-05 168 views
1

我希望有人可以幫助我解決一些小問題。我正試圖跟蹤鼠標在屏幕上的位置,我一直沒有問題。但是,當它通過一個按鈕時,它會停止跟蹤。有沒有人有任何想法可以解決這個問題?這裏是我試圖處理的更廣泛的問題的一個簡單的例子:JavaFX按鈕使鼠標事件消失

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

在此先感謝!

回答

-1

的按鈕添加新的鼠標移動事件也,如果你想跟蹤鼠標光標在按鈕上方的位置也

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

這將給你關於按鈕的座標。如果你想在尊重場景的位置(座標),然後使用

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

非常感謝! –

2

使用鼠標移動的事件處理程序,並得到x和y使用event.getSceneX()和event.getSceneY()方法就像爲:

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

太謝謝你了!這樣一個簡單的解決方案,我一直沒有能夠修復的天,哈哈 –

+0

總是WC! @AngiePinchbeck –

0

應用程序停止跟蹤鼠標事件,因爲默認值(和預期)行爲控制是消耗他們接收所有的鼠標事件。也就是說,這些鼠標事件不會冒泡(Event Delivery Process)給他們的父母。由此,只要在按鈕上執行鼠標動作,場景節點(以及按鈕的所有其他父節點)就停止接收鼠標事件。

另一個解決方案是在活動期間使用事件過濾器過濾器,因爲被稱爲捕獲階段,因此前JavaFX的內部事件處理程序消耗的控制鼠標事件:

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