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

109

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

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

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

Спасибо

Мартин Триго
источник

Ответы:

206

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

vpram86
источник
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.

Stevorino
источник
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 + ")");
    }
  }
}
Srb
источник
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;
}
Sudipn
источник