Java Swing 和 AWT - 鼠标位置不准确

Java Swing & AWT - Mouse Position Not Accurate

我有一个基本程序可以在 java.awt.Canvas 上呈现鼠标的位置。但是鼠标离坐标0, 0(window左上角)越远越不准确

屏幕上绘制的框(表示鼠标位置)似乎越来越落后于实际鼠标位置。是不是我做错了什么,或者这是 AWT 或 Swing 的问题。

这是我的代码:

import java.awt.Canvas;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.image.BufferStrategy;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferInt;

import javax.swing.JFrame;

public class Main extends Canvas implements Runnable {
    private static final long serialVersionUID = 1L;

    private BufferedImage image;
    private int[] pixels;

    private static final MouseHandler handler = new MouseHandler();

    public Main() {
        image = new BufferedImage(640, 480, BufferedImage.TYPE_INT_RGB);
        pixels = ((DataBufferInt)image.getRaster().getDataBuffer()).getData();
        initWindow();

        addMouseMotionListener(handler);

        start();
    }

    private void initWindow() {
        Dimension d = new Dimension(image.getWidth(), image.getHeight());
        JFrame f = new JFrame("Mouse Pointer");
        f.setPreferredSize(d);
        f.setMinimumSize(d);
        f.setMaximumSize(d);

        f.setVisible(true);
        f.setResizable(false);
        f.add(this);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    private void start() {
        new Thread(this).start();
    }

    private void render() {
        BufferStrategy bs = getBufferStrategy();
        if(bs == null) {
            createBufferStrategy(3);
            return;
        }

        clearScreen();
        drawMousePos();

        Graphics g = bs.getDrawGraphics();
        g.drawImage(image, 0, 0, getWidth(), getHeight(), null);
        g.dispose();
        bs.show();
    }

    public void run() {
        while(true) {
            render();
        }
    }

    private void clearScreen() {
        for(int i = 0; i < pixels.length; i++) pixels[i] = 0;
    }

    //draw 3 by 3 box around mouse position
    private void drawMousePos() {
        for(int y = -1; y <= 1; y++) {
            for(int x = -1; x <= 1; x ++) {
                if((handler.x + x) >= 0 && 
                        (handler.x + x) <= image.getWidth() && 
                        (handler.y + y) >= 0 && 
                        (handler.y + y) <= image.getHeight())
                    pixels[(handler.x + x) + (handler.y + y) * image.getWidth()] = 0xff00ff00;
            }
        }
    }

    public static void main(String[] args) {
        new Main();
    }

}

鼠标处理程序class:

import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;

public class MouseHandler implements MouseMotionListener {

    public int x, y;

    public void mouseDragged(MouseEvent e) {
        x = e.getX();
        y = e.getY();
    }

    public void mouseMoved(MouseEvent e) {
        x = e.getX();
        y = e.getY();
    }

}

提前感谢您的帮助。

这里的问题是你正在设置整个框架的大小,即 480 - 这是 window 标题栏的高度,这就是为什么内容窗格的实际大小较小 (~455),然后在绘制过程中缩小图像。

要解决此问题 - 将内容窗格大小设置为所需大小:

f.getContentPane().setPreferredSize(d);
f.getContentPane().setMinimumSize(d);
f.getContentPane().setMaximumSize(d);

您在 drawMousePos 中也有小错误:

(handler.x + x) <= image.getWidth() 应该使用 < 而不是 <=