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()
应该使用 <
而不是 <=
我有一个基本程序可以在 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()
应该使用 <
而不是 <=