【问题标题】:Retrieve mouse position in JavaFX without event在没有事件的情况下检索 JavaFX 中的鼠标位置
【发布时间】:2017-12-25 08:12:18
【问题描述】:

我想在显示舞台之前检索当前鼠标位置的 x 和 y 坐标。

到目前为止,我发现在 JavaFX 中获取鼠标位置的唯一方法是在 MouseEvent 内,这不适用于我的情况。此外,我发现可以通过java.awt.MouseInfo 检索位置。然而,我认为这是一个坏主意(我使用 JavaFX 而不是 AWT),并且至少在我的情况下,结果是 HeadlessException

是否有其他干净的可能性来检索 JavaFX 中的鼠标位置而不会太笨拙(例如,模拟 MouseEvent 只是为了获取位置)?

非常感谢!

【问题讨论】:

  • 我不是专家,但据我所知,这并不容易。鼠标/光标通常是一个 OS 元素,除非你有一个窗口来捕捉它,否则你不会得到它。您可能需要降低到原生级别(JNA?),或者您需要创建并显示一个透明的Stage,然后获取坐标,然后丢弃该透明阶段。
  • @Jai 感谢您的反馈。情况可能确实如此,因此要获得一个干净的解决方案,可能无法但以某种方式模拟MouseEvent

标签: java javafx position mouse-cursor


【解决方案1】:

好吧,您可以使用 Robot 类获取鼠标坐标。这是一个例子。

com.sun.glass.ui.Robot robot =
                com.sun.glass.ui.Application.GetApplication().createRobot();

        int y = robot.getMouseY();
        System.out.println("y point = " + y);
        int x = robot.getMouseX();
        System.out.println("x point= " + x);

它在 linux(基本操作系统)上尝试过,它可以工作。

更新: 经过一番谷歌搜索,我发现 TestFX 看起来像是在尝试实现 Robot 类的原型。看看下面给出的链接。 https://github.com/TestFX/Robot http://mail.openjdk.java.net/pipermail/openjfx-dev/2015-December/018412.html

你也可以这样来获取坐标。

public void start(Stage primaryStage) throws Exception {
        GlassRobot robot = new GlassRobotImpl();
        Point2D point = robot.getMouseLocation();
        double x = point.getX();
        double y = point.getY();
        System.out.println("y = " + y);
        System.out.println("x = " + x);
        if(x > 10) {
              primaryStage.show();
       }
public static void main(String[] args) {
        launch(args);
    }

【讨论】:

  • com.sun.glass.ui.Robot 是内部 API 的一部分,据我所知,它在 Java 9 中不会那么容易访问(如果我错了,请纠正我)。我正在尝试为 JavaFX 找到干净的解决方案。
  • 经过一番谷歌搜索后,我找到了一个链接,上面说 Glass Robot API 将替代 com.sun.glass.ui.Robot 类。所以,你不应该担心。看看下面给出的链接。 bugs.openjdk.java.net/browse/JDK-8090763
  • 感谢您的链接。看起来目前似乎没有干净的解决方案。因此,我会将您的答案标记为已接受。
  • 从 11 开始,它有一个名为 javafx.scene.robot.Robot 的机器人,它似乎更适合在 JavaFX 中使用。
【解决方案2】:

正如@lambad 建议的那样,Robot 课程似乎是满足您需求的一种不错的方式。

我认为使用 JavaFX 版本的 Robot 更合适,即javafx.scene.robot.Robot

您可以简单地使用 getMousePosition() 方法将当前鼠标 (x,y) 屏幕坐标返回为 javafx.geometry.Point2D

import javafx.scene.robot.Robot;

Robot robot = new Robot();

System.out.println("X is: " + robot.getMousePosition().getX());
System.out.println("Y is: " + robot.getMousePosition().getY());


笔记: 机器人对象必须在 JavaFX 应用程序线程上构建和使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-05
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    • 2019-06-13
    • 1970-01-01
    相关资源
    最近更新 更多