1

我正在尝试跟踪鼠标光标的位置,因此需要使用线程来继续跟踪它。我的线程只运行一次。我猜我一路上错过了一些东西。

编码 :

鼠标位置类

import java.awt.MouseInfo;
import java.awt.Point;
import java.util.Timer;

public class mousePosition implements Runnable
{
    static Point mouseLocation = MouseInfo.getPointerInfo().getLocation();
    static Timer t = new Timer();
    int x,y = 0;


    public void run()
    {
        try
        {
                x = mouseLocation.x;
                y = mouseLocation.y;

                System.out.println("X:"+x+" Y:"+y+" at time "+System.currentTimeMillis());
        }

        catch(Exception e)
        {
            System.out.println("Exception caught : "+e);
        }

    }



}

主班

public class threadRunner
{
    public static void main(String[] args)
    {
        Thread t1 = new Thread(new mousePosition());

        t1.start();

    }

}

感谢您的任何帮助。我知道之前有人问过这个问题,但我仍在努力让它发挥作用。

4

5 回答 5

6

Thread 的run()方法只会运行一次。如果您执行以下操作,它将运行得更多:

public void run() {
  while(true) { // Or with a stop condition
    try {
            x = mouseLocation.x;
            y = mouseLocation.y;

            System.out.println("X:"+x+" Y:"+y+" at time "+System.currentTimeMillis());

    } catch(Exception e) {
        System.out.println("Exception caught : "+e);
    }
  }
}

虽然我确信线程上的这个 while 循环很昂贵,但就计算成本而言,并且使用Observer 设计模式有更好的实践。这种良好实践的实现和示例正是MouseListener

于 2012-07-20T11:54:08.713 回答
2

这是每 50 毫秒读取一次鼠标位置的简单方法

class mousePosition {
    public static void main(String[] args) {
        Timer t = new Timer();
        t.schedule(new TimerTask() {
            public void run() {
                int x, y;
                try {
                    PointerInfo mouseLocation = MouseInfo.getPointerInfo();
                    x = mouseLocation.getLocation().x;
                    y = mouseLocation.getLocation().y;
                    System.out.println("X:" + x + " Y:" + y + " at time "
                            + System.currentTimeMillis());
                } catch (Exception e) {
                    System.out.println("Exception caught : " + e);
                }
            }
        }, 0, 50);
    }
}
于 2012-07-20T11:53:28.743 回答
2

当您start()使用 newThread时,唯一发生的事情就是执行了Threadsrun()方法。一旦run()方法完成,Thread死亡。

要不断检查鼠标位置,您可能应该开始某种方式,这里MouseListener有一个很好的教程。

要了解有关线程的更多信息,我建议查看有关该主题的 Java 教程

于 2012-07-20T11:43:32.180 回答
0

做这个 :

public void run()
    {
        try
        {       
                boolean mouseTracked = false;
                while(!mouseTracked){
                   x = mouseLocation.x;
                   y = mouseLocation.y;

                System.out.println("X:"+x+" Y:"+y+" at time "+System.currentTimeMillis());
                mouseTracked = true; //do this when mouse tracked..
        }
}
        catch(Exception e)
        {
            System.out.println("Exception caught : "+e);
        }

    }

这将继续跟踪鼠标,直到您将 mouseTracked 设置为 true,将 mouseTracked 设置为 true,您将在匹配条件下执行此操作

于 2012-07-20T11:47:50.997 回答
0

像这样改变你的班级

import java.awt.MouseInfo;
import java.awt.Point;
import java.util.Timer;

public class MousePosition implements Runnable
{
static Point mouseLocation = null;
static Timer t = new Timer();
int x,y = 0;


public void run()
{   
  while(true){
    try
    {
          mouseLocation= MouseInfo.getPointerInfo().getLocation();

            x = mouseLocation.x;
            y = mouseLocation.y;

            System.out.println("X:"+x+" Y:"+y+" at time "+System.currentTimeMillis());
    }

    catch(Exception e)
    {
        System.out.println("Exception caught : "+e);
    }
  }
}
}
于 2012-07-20T11:49:31.197 回答