【问题标题】:JavaFX button makes mouse event disappearJavaFX按钮使鼠标事件消失
【发布时间】:2017-10-05 06:14:50
【问题描述】:

我希望有人能帮我解决一个小问题。我正在尝试在屏幕上跟踪鼠标的位置,这没有问题。但是,当它越过按钮时,它会停止跟踪。有谁知道我该如何解决这个问题?这是我正在尝试解决的更广泛问题的一个简单示例:

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

提前致谢!

【问题讨论】:

    标签: button javafx mouseevent


    【解决方案1】:

    使用鼠标移动事件处理程序并使用 event.getSceneX() 和 event.getSceneY() 方法获取 x 和 y,如下所示:

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

    【讨论】:

    • 非常感谢!对于我好几天都无法修复的问题,这是一个如此简单的解决方案,哈哈
    • 总是厕所! @AngiePinchbeck
    【解决方案2】:

    应用程序停止跟踪鼠标事件,因为控件的默认(和预期)行为是消耗它们接收到的所有鼠标事件。也就是说,这些鼠标事件被阻止向它们的父级冒泡 (Event Delivery Process)。这样,只要在按钮上执行鼠标操作,场景节点(以及按钮的所有其他父节点)就会停止接收鼠标事件。

    另一个解决方案是使用事件过滤器,因为过滤器是在事件捕获阶段调用的,因此在 JavaFX 的内部事件处理程序为控件使用鼠标事件之前:

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

    【讨论】:

      【解决方案3】:

      如果您还想跟踪鼠标光标在按钮上的位置,也可以为按钮添加新的鼠标移动事件

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

      这将为您提供按钮的坐标。如果你想要关于场景的位置(坐标),那么使用

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

      【讨论】:

      • 非常感谢!
      猜你喜欢
      • 1970-01-01
      • 2022-07-27
      • 1970-01-01
      • 2018-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多