Obter posição do mouse

109

Eu gostaria de simular um movimento natural do mouse em Java (indo daqui para lá pixel por pixel). Para fazer isso, preciso saber as coordenadas de partida.

Encontrei o método event.getX () e event.getY (), mas preciso de um evento ...

Como posso saber as posições sem fazer nada (ou algo não visível)?

Obrigado

Martin Trigaux
fonte

Respostas:

205

MouseInfo.getPointerInfo (). GetLocation () pode ser útil. Ele retorna um objeto Point correspondente à posição atual do mouse.

vpram86
fonte
46
getPointerInfo().getLocation()retorna a posição relativa à tela. Se você quiser a posição relativa ao seu componente (como fornecida por MouseListeners), você pode subtrair yourComponent.getLocationOnScreen()dela.
Thomas Ahle
2
O +1 Container.getMousePosition()pode retornar algumas vezes nullse o mouse estiver se movendo muito rápido, usando isso evita o problema.
Emily L.
11
Além do que @ThomasAhle disse, você pode evitar implementá-lo sozinho, usando um método de conveniência já implementado:SwingUtilities.convertPointFromScreen(MouseInfo.getPointerInfo().getLocation(), component)
Andrei Vajna II
1
Note MouseInfo.getPointerInfo()pode retornar null quando não há mouse ou em algumas configurações multimon.
NateS
2
Observe que SwingUtilities.convertPointFromScreen(..)converte o primeiro argumento no local e não retorna nada, portanto, ele precisa ser escrito de forma um pouco diferente em relação ao comentário @AndreiVajnaII para que possamos obter o Pointobjeto.
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);
Nauman Khalid
fonte
18
Por favor, adicione na próxima vez alguns comentários.
CSchulz
10

No SWT, você não precisa estar em um ouvinte para chegar à localização do mouse. O objeto Display possui o método getCursorLocation().

No vanilla SWT / JFace, ligue Display.getCurrent().getCursorLocation().

Em um aplicativo RCP, chame PlatformUI.getWorkbench().getDisplay().getCursorLocation().

Para aplicativos SWT, é preferível usar em getCursorLocation()vez do MouseInfo.getPointerInfo()que outros mencionaram, pois o último é implementado no kit de ferramentas AWT que o SWT foi projetado para substituir.

Stevorino
fonte
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
fonte
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 
        }

    }

}
Josh McQuinn
fonte
4

Tente examinar a classe java.awt.Robot. Ele permite que você mova o mouse de maneira programática.

Jeff Storey
fonte
1

Estou fazendo algo assim para obter as coordenadas do mouse usando o Robot. Uso ainda mais essas coordenadas em alguns dos jogos que estou desenvolvendo:

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;
            }
        }
    }
}
Varun Ved
fonte
0

Se estiver usando o SWT, você pode querer adicionar um MouseMoveListener conforme explicado aqui .

Topher Fangio
fonte
4
mas o Listener é executado apenas se eu fizer algo (mover, clicar) com meu mouse, certo? A primeira coisa que preciso antes de movê-lo é saber a posição inicial
Martin Trigaux,
0

No meu cenário, eu deveria abrir uma caixa de diálogo na posição do mouse com base em uma operação da GUI feita com o mouse. O código a seguir funcionou para mim:

    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
fonte