Nhận vị trí chuột


109

Tôi muốn mô phỏng chuyển động chuột tự nhiên trong Java (đi từ đây đến đó từng pixel một). Để làm điều đó, tôi cần biết tọa độ bắt đầu.

Tôi đã tìm thấy phương thức event.getX () và event.getY () nhưng tôi cần một sự kiện ...

Làm thế nào tôi có thể biết các vị trí mà không làm bất cứ điều gì (hoặc một cái gì đó không nhìn thấy)?

Cảm ơn bạn

Câu trả lời:


205

MouseInfo.getPointerInfo (). GetLocation () có thể hữu ích. Nó trả về một đối tượng Point tương ứng với vị trí chuột hiện tại.


46
getPointerInfo().getLocation()trả về vị trí so với màn hình. Nếu bạn muốn vị trí liên quan đến thành phần của mình (như do MouseListists đưa ra), bạn có thể trừ yourComponent.getLocationOnScreen()nó đi.
Thomas Ahle

2
+1 đôi khi Container.getMousePosition()có thể quay lại nullnếu chuột di chuyển quá nhanh, việc sử dụng điều này sẽ tránh được sự cố.
Emily L.

11
Ngoài những gì @ThomasAhle nói, bạn có thể tránh việc thực hiện nó cho mình, bằng cách sử dụng một phương pháp convinience đã thực hiện:SwingUtilities.convertPointFromScreen(MouseInfo.getPointerInfo().getLocation(), component)
Andrei Vajna II

1
Lưu ý MouseInfo.getPointerInfo()có thể trả về null khi không có chuột hoặc trong một số thiết lập multimon.
NateS

2
Lưu ý rằng SwingUtilities.convertPointFromScreen(..)chuyển đổi đối số đầu tiên tại chỗ và không trả về bất kỳ thứ gì, vì vậy nó cần được viết hơi khác một chút so với nhận xét @AndreiVajnaII để chúng ta có thể nắm bắt Pointđối tượng.
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
Xin vui lòng thêm lần sau một số ý kiến.
CSchulz

10

Trong SWT, bạn không cần phải ở trong một trình lắng nghe để có được vị trí chuột. Đối tượng Display có phương thức getCursorLocation().

Trong SWT / JFace vani, hãy gọi Display.getCurrent().getCursorLocation().

Trong một ứng dụng RCP, hãy gọi PlatformUI.getWorkbench().getDisplay().getCursorLocation().

Đối với các ứng dụng SWT, nó là thích hợp hơn để sử dụng getCursorLocation()hơn MouseInfo.getPointerInfo()mà người khác đã đề cập, vì sau đó được thực hiện trong bộ công cụ AWT rằng SWT được thiết kế để thay thế.


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

Hãy thử nhìn vào lớp java.awt.Robot. Nó cho phép bạn di chuyển chuột theo chương trình.



1

Tôi đang làm điều gì đó như thế này để lấy tọa độ chuột bằng Robot, tôi sử dụng thêm các tọa độ này trong một vài trò chơi mà tôi đang phát triển:

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

Nếu bạn đang sử dụng SWT, bạn có thể muốn xem thêm MouseMoveListener như được giải thích ở đây .


4
nhưng Listener chỉ được thực thi nếu tôi làm điều gì đó (di chuyển, nhấp chuột) bằng chuột của mình, phải không? Điều đầu tiên tôi cần trước khi chuyển nó là phải biết vị trí bắt đầu
Martin Trigaux

0

Trong tình huống của tôi, tôi phải mở một hộp thoại ở vị trí chuột dựa trên thao tác GUI được thực hiện với chuột. Đoạn mã sau phù hợp với tôi:

    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;
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.