Java 为什么不是';我的程序不能处理鼠标运动吗?(爪哇)

Java 为什么不是';我的程序不能处理鼠标运动吗?(爪哇),java,events,mouseevent,Java,Events,Mouseevent,我试着做一些很酷的“鼠标跟踪器”。。它会记录您的鼠标位置,直到您按下“轨迹”按钮,当您单击它时,它会“恢复”鼠标位置 它似乎无法处理mouseMove方法。为什么? import java.awt.AWTException; import java.awt.Dimension; import java.awt.Point; import java.awt.Robot; import java.awt.event.ActionEvent; import java.awt.event.ActionL

我试着做一些很酷的“鼠标跟踪器”。。它会记录您的鼠标位置,直到您按下“轨迹”按钮,当您单击它时,它会“恢复”鼠标位置

它似乎无法处理mouseMove方法。为什么?

import java.awt.AWTException;
import java.awt.Dimension;
import java.awt.Point;
import java.awt.Robot;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import javax.swing.JButton;
import javax.swing.JFrame;


public class Mouse implements MouseMotionListener {
    JFrame frame = new JFrame();
    JButton move = new JButton("Track");
    Point[] points = new Point[100000];
    int i = 0;


    public Mouse() {
        // restore on track
        move.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent arg0) {
                try {
                    Mouse.this.restore();
                } catch (InterruptedException | AWTException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

            }
        });
        // initialize component
        frame.setPreferredSize(new Dimension(300, 300));
        frame.getContentPane().add(move);
        frame.addMouseMotionListener(this);
        frame.pack();
        frame.setVisible(true);
    }
    @Override
    public void mouseDragged(MouseEvent e) {}

    @Override
    public void mouseMoved(MouseEvent e) {
        System.out.println("Mouve move");
        if(i < 100000) {
            points[i] = e.getLocationOnScreen();
            i++;
        }
    }

    public void restore() throws InterruptedException, AWTException {
        System.out.println("Mouse restored");
        for(int j = 0; j < i; j++) {
            Robot r = new Robot();
            r.mouseMove(points[j].x, points[j].y);
            Thread.sleep(100);
        }
    }

    public static void main(String[] args) {
        Mouse s = new Mouse();
    }

}
import java.awt.AWTException;
导入java.awt.Dimension;
导入java.awt.Point;
导入java.awt.Robot;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.awt.event.MouseEvent;
导入java.awt.event.MouseMotionListener;
导入javax.swing.JButton;
导入javax.swing.JFrame;
公共类Mouse实现MouseMotionListener{
JFrame=新JFrame();
JButton move=新JButton(“轨道”);
点[]点=新点[100000];
int i=0;
公共鼠标(){
//恢复正常
move.addActionListener(新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件arg0){
试一试{
Mouse.this.restore();
}捕获(中断异常| awtex异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
});
//初始化组件
frame.setPreferredSize(新尺寸(300300));
frame.getContentPane().add(移动);
frame.addMouseMotionListener(此);
frame.pack();
frame.setVisible(true);
}
@凌驾
公共无效mouseDragged(MouseEvent e){}
@凌驾
public void mouseMoved(MouseEvent e){
System.out.println(“move move move”);
如果(i<100000){
点[i]=e.getLocationOnScreen();
i++;
}
}
public void restore()引发InterruptedException,AWTException{
System.out.println(“鼠标恢复”);
对于(int j=0;j
  • MouseListener
    添加到
    JFrame
    或其
    ContentPane
    ,而不是
    JButton
    -主要原因
  • 使用
    SwingUtilities.invokeLater()在EDT线程中运行Swing
  • 调用
    restore
  • 将机器人创建置于循环之外
  • 这个

    for(int j=0;j

    Robot r=新机器人();
    对于(int j=0;j
    那么,按下按钮后实际会发生什么?i
    的值是多少,是不是>0?在
    for
    循环的
    外部创建
    机器人
    。@user1798362,frame.removeMouseMotionListener(此);
    for(int j = 0; j < i; j++) {
        Robot r = new Robot();
    
    Robot r = new Robot();
    for(int j = 0; j < i; j++) {