当我运行这个小鼠标钩应用程序时,为什么我的鼠标会滞后?

时间:2016-03-12 13:16:53

标签: java swing

这是我几年前写的一个小鼠标钩子应用程序,我只是想知道为什么每次运行它都会导致鼠标滞后。

我记得在某处我必须调用一些方法来手动处理资源或使用MouseListener。每当我在屏幕上拖动任何窗口时,它都会使鼠标滞后,并且当它没有运行时就不会发生这种情况。知道为什么吗? (我知道我在EDT上运行了一个while循环,我的2个JLabel的变量名是J和C,起诉我)

import java.awt.*;
import javax.swing.JFrame;
import javax.swing.JLabel;


public class MouseLocation {

    Point p;
    int x,y;

    MouseLocation() throws AWTException {

    }

    public String printLocation(){
        p = MouseInfo.getPointerInfo().getLocation();
        x = p.x;
        y = p.y;
        String location = (x + " - " + y);

        return location;
    }

    public Color getMouseColor() throws AWTException{
        Robot r = new Robot();
        return r.getPixelColor(x, y);
    }



    public static void main(String[] args) throws AWTException {
        MouseLocation m = new MouseLocation();

        JFrame frame = new JFrame("Mouse Location Display");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(450,110);
        frame.setLayout(new FlowLayout());
        JLabel j = new JLabel();
        JLabel c = new JLabel();

        j.setFont (j.getFont ().deriveFont (24.0f));
        c.setForeground(Color.red);

        frame.add(j);
        frame.add(c);
        frame.setVisible(true);
        while (true){
            j.setText("Current Mouse Location: " + m.printLocation());

            c.setText(String.valueOf(m.getMouseColor()));
        }
    }
}

1 个答案:

答案 0 :(得分:3)

您要以非常快的速度请求鼠标位置。 尝试在循环中添加Thread.sleep(时间):

while (true){
    j.setText("Current Mouse Location: " + m.printLocation());
    c.setText(String.valueOf(m.getMouseColor()));

    // waiting a few milliseconds
    Thread.sleep(200);
}

此外,重用对象以避免重新分配是最佳做法。 您可以像这样改进方法getMouseColor

// Global var
Robot robot;

MouseLocation() throws AWTException {
    robot = new Robot();
}

public Color getMouseColor() {
    return robot.getPixelColor(x, y);
}

修改

按照@ cricket_007的建议,使用计时器以避免在主线程中使用Thread.sleep(并在while循环中):

new Timer().schedule(new TimerTask() {

    @Override
    public void run() {
        j.setText("Current Mouse Location: " + m.printLocation());
        c.setText(String.valueOf(m.getMouseColor()));
    }
}, 0, 200); // 200 milliseconds