2017-10-05 8 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); 
    }); 
} 

ありがとうございます!

使用マウスのようにイベントハンドラを移動しevent.getSceneXを(使用してxとyを取得)などevent.getSceneY()メソッド

答えて

-1

ボタン上のマウスカーソル位置

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

これは、ボタンの座標を示します。あなたがシーンの点での位置(座標)をしたい場合は、その後

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

ありがとうございました! –

2

:追跡したい場合も、ボタンの新しいマウス移動イベントを追加

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); 
}); 
関連する問題