รับตำแหน่งเมาส์


109

ฉันต้องการจำลองการเคลื่อนไหวของเมาส์ตามธรรมชาติใน Java (จากที่นี่ไปที่นั่นทีละพิกเซล) ในการทำเช่นนั้นฉันต้องรู้พิกัดเริ่มต้น

ฉันพบเมธอด event.getX () และ event.getY () แต่ฉันต้องการเหตุการณ์ ...

ฉันจะรู้ตำแหน่งโดยไม่ทำอะไรเลย (หรือสิ่งที่มองไม่เห็น) ได้อย่างไร

ขอบคุณ

คำตอบ:


206

MouseInfo.getPointerInfo (). getLocation ()อาจเป็นประโยชน์ ส่งคืนวัตถุจุดที่ตรงกับตำแหน่งเมาส์ปัจจุบัน


46
getPointerInfo().getLocation()คืนตำแหน่งที่สัมพันธ์กับหน้าจอ หากคุณต้องการให้ตำแหน่งสัมพันธ์กับส่วนประกอบของคุณ (เช่นที่ MouseListeners กำหนด) คุณสามารถลบออกyourComponent.getLocationOnScreen()ได้
Thomas Ahle

2
Container.getMousePosition()บางครั้ง+1 อาจกลับมาnullหากเมาส์เคลื่อนที่เร็วเกินไปการใช้สิ่งนี้จะหลีกเลี่ยงปัญหา
Emily L.

11
นอกเหนือจากสิ่งที่ @ThomasAhle กล่าวแล้วคุณสามารถหลีกเลี่ยงการใช้งานได้ด้วยตัวเองโดยใช้วิธีการที่น่าSwingUtilities.convertPointFromScreen(MouseInfo.getPointerInfo().getLocation(), component)
เชื่อถือที่

1
หมายเหตุMouseInfo.getPointerInfo()สามารถคืนค่าว่างได้เมื่อไม่มีเมาส์หรือในการตั้งค่ามัลติมอน
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 คุณไม่จำเป็นต้องอยู่ในผู้ฟังเพื่อรับตำแหน่งเมาส์ 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

ฉันกำลังทำบางสิ่งเช่นนี้เพื่อรับพิกัดเมาส์โดยใช้ 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
แต่ Listener จะทำงานก็ต่อเมื่อฉันทำบางอย่าง (ย้ายคลิก) ด้วยเมาส์ใช่ไหม สิ่งแรกที่ฉันต้องการก่อนที่จะย้ายคือการรู้ตำแหน่งเริ่มต้น
Martin Trigaux

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;
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.