gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 01:58:49 26 4
gpt4 key购买 nike

我有一个基本程序,可以在 java.awt.Canvas 上呈现鼠标的位置。然而,鼠标距离坐标 0, 0(窗口左上角)越远,它就越不准确。

屏幕上绘制的框(代表鼠标位置)似乎越来越落后于实际鼠标位置。是否有什么地方我做得不对,或者这是 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();
}

}

鼠标处理程序类:

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 - 它是带有标题栏的窗口的高度,这就是内容 Pane 的实际大小较小的原因(~ 455),那么在绘画过程中你会缩小图像的比例。

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

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

drawMousePos 中还有一个小错误:

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

关于Java Swing 和 AWT - 鼠标位置不准确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51919636/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com