获取鼠标位置


109

我想在Java中模拟鼠标的自然运动(从这里到另一个像素)。为此,我需要知道起始坐标。

我找到了方法event.getX()和event.getY(),但是我需要一个事件...

我如何不做任何事情(或看不见的事情)就知道职位?

谢谢

Answers:


205

MouseInfo.getPointerInfo()。getLocation()可能会有所帮助。它返回与当前鼠标位置相对应的Point对象。


46
getPointerInfo().getLocation()返回相对于屏幕的位置。如果您想要相对于组件的位置(如MouseListeners给定的),则可以从中减去yourComponent.getLocationOnScreen()
Thomas Ahle 2012年

2
如果鼠标移动得太快,+ 1 Container.getMousePosition()有时会返回null,因此可以避免该问题。
艾米丽·L.

11
除了@ThomasAhle所说的以外,您还可以通过使用已经实施的便捷方法来避免自己实施:SwingUtilities.convertPointFromScreen(MouseInfo.getPointerInfo().getLocation(), component)
Andrei Vajna II 2014年

1
MouseInfo.getPointerInfo()没有鼠标或在某些multimon设置中,Note 可以返回null。
NateS

2
请注意,它会SwingUtilities.convertPointFromScreen(..)就地转换第一个参数,并且不返回任何内容,因此与@AndreiVajnaII注释相比,它的编写方式有所不同,这样我们就可以控制该Point对象。
Evgeni Sergeev

42
PointerInfo a = MouseInfo.getPointerInfo();
Point b = a.getLocation();
int x = (int) b.getX();
int y = (int) b.getY();
System.out.print(y + "jjjjjjjjj");
System.out.print(x);
Robot r = new Robot();
r.mouseMove(x, y - 50);

18
请下次添加一些评论。
CSchulz

10

在SWT中,您不必处于侦听器中即可到达鼠标位置。Display对象具有方法getCursorLocation()

在香草SWT / JFace中,致电Display.getCurrent().getCursorLocation()

在RCP应用程序中,调用PlatformUI.getWorkbench().getDisplay().getCursorLocation()

对于SWT应用中,优选使用getCursorLocation()MouseInfo.getPointerInfo(),其他人已经提到的那样,因为后者在AWT工具包,SWT被设计用来替换实现。


6
import java.awt.MouseInfo;
import java.awt.GridLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.MouseListener;
import java.awt.event.MouseEvent;

import javax.swing.*;

public class MyClass {
  public static void main(String[] args) throws InterruptedException{
    while(true){
      //Thread.sleep(100);
      System.out.println("(" + MouseInfo.getPointerInfo().getLocation().x + 
              ", " + 
              MouseInfo.getPointerInfo().getLocation().y + ")");
    }
  }
}

6
import java.awt.MouseInfo;
import java.util.concurrent.TimeUnit;

public class Cords {

    public static void main(String[] args) throws InterruptedException {

        //get cords of mouse code, outputs to console every 1/2 second
        //make sure to import and include the "throws in the main method"

        while(true == true)
        {
        TimeUnit.SECONDS.sleep(1/2);
        double mouseX = MouseInfo.getPointerInfo().getLocation().getX();
        double mouseY = MouseInfo.getPointerInfo().getLocation().getY();
        System.out.println("X:" + mouseX);
        System.out.println("Y:" + mouseY);
        //make sure to import 
        }

    }

}



1

我正在做类似的事情来使用机器人获取鼠标坐标,我在开发的一些游戏中还使用了这些坐标:

public class ForMouseOnly {
    public static void main(String[] args) throws InterruptedException {
        int x = MouseInfo.getPointerInfo().getLocation().x;
        int y = MouseInfo.getPointerInfo().getLocation().y;
        while (true) {

            if (x != MouseInfo.getPointerInfo().getLocation().x || y != MouseInfo.getPointerInfo().getLocation().y) {
                System.out.println("(" + MouseInfo.getPointerInfo().getLocation().x + ", "
                        + MouseInfo.getPointerInfo().getLocation().y + ")");
                x = MouseInfo.getPointerInfo().getLocation().x;
                y = MouseInfo.getPointerInfo().getLocation().y;
            }
        }
    }
}

0

如果您使用的是SWT,则可能需要按照此处的说明添加一个MouseMoveListener 。


4
但是只有当我用鼠标做某事(移动,单击)时,才会执行监听器,对吗?在移动之前,我需要做的第一件事就是知道开始位置
Martin Trigaux 09/09/17

0

在我的场景中,我应该基于使用鼠标完成的GUI操作在鼠标位置打开一个对话框。以下代码为我工作:

    public Object open() {
    //create the contents of the dialog
    createContents();
    //setting the shell location based on the curent position
    //of the mouse
    PointerInfo a = MouseInfo.getPointerInfo();
    Point pt = a.getLocation();
    shellEO.setLocation (pt.x, pt.y);

    //once the contents are created and location is set-
    //open the dialog
    shellEO.open();
    shellEO.layout();
    Display display = getParent().getDisplay();
    while (!shellEO.isDisposed()) {
        if (!display.readAndDispatch()) {
            display.sleep();
        }
    }
    return result;
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.