Получить позицию мыши


109

Я хотел бы смоделировать естественное движение мыши в Java (переход от одного к другому пиксель за пикселем). Для этого мне нужно знать начальные координаты.

Я нашел метод event.getX () и event.getY (), но мне нужно событие ...

Как я могу узнать позиции, ничего не делая (или чего-то не видимого)?

Спасибо

Ответы:


206

MouseInfo.getPointerInfo (). GetLocation () может быть полезным. Он возвращает объект Point, соответствующий текущей позиции мыши.


46
getPointerInfo().getLocation()возвращает положение относительно экрана. Если вам нужна позиция относительно вашего компонента (например, заданная MouseListeners), вы можете вычесть yourComponent.getLocationOnScreen()из нее.
Thomas Ahle

2
+1 Container.getMousePosition()может иногда возвращаться, nullесли мышь движется слишком быстро, это позволяет избежать проблемы.
Эмили Л.

11
В дополнение к тому, что сказал @ThomasAhle, вы можете избежать его реализации самостоятельно, используя уже реализованный метод удобства:SwingUtilities.convertPointFromScreen(MouseInfo.getPointerInfo().getLocation(), component)
Андрей Вайна II,

1
Примечание MouseInfo.getPointerInfo()может возвращать значение null, если нет мыши или в некоторых настройках с несколькими мониторами.
NateS

2
Обратите внимание, что SwingUtilities.convertPointFromScreen(..)первый аргумент преобразуется на месте и ничего не возвращает, поэтому его нужно написать немного по-другому относительно комментария @AndreiVajnaII, чтобы мы могли получить Pointобъект.
Евгений Сергеев

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 
        }

    }

}

4

Попробуйте взглянуть на класс java.awt.Robot. Это позволяет вам перемещать мышь программно.



1

Я делаю что-то подобное, чтобы получить координаты мыши с помощью Robot, я использую эти координаты в некоторых играх, которые разрабатываю:

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
но слушатель запускается только в том случае, если я что-то делаю (перемещаю, щелкаю) мышью, верно? Первое, что мне нужно перед его перемещением, это знать стартовую позицию
Мартин Триго

0

В моем сценарии я должен был открыть диалоговое окно в позиции мыши на основе операции графического интерфейса, выполняемой с помощью мыши. У меня сработал следующий код:

    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;
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.