2017-10-05 4 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

당신에게 너무 감사합니다

또 다른 솔루션과 자바 FX의 내부 이벤트 핸들러는 컨트롤의 마우스 이벤트를 소비하여 이전 단계를 캡처 행사 기간 동안 필터가 호출되기 때문에 이벤트 필터를 사용하는 것입니다! 내가 며칠 동안 고칠 수 없었던 그런 쉬운 솔루션, 하하 –

+0

Always WC! @AngiePinchbeck –

0

를 사용합니다. 즉, 이러한 마우스 이벤트는 부모에게 버블 링되는 것을 방지합니다 (Event Delivery Process). 이를 통해 장면 노드 (및 버튼의 다른 모든 부모 노드)는 마우스 동작이 버튼에서 수행 될 때마다 마우스 이벤트 수신을 중지합니다.

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