我目前正在开发我的第一个项目,一个使用 Java Swing 和 AWT 的简单绘画应用程序。在实现绘画功能时,我遇到了准确捕获鼠标移动的问题,特别是在快速移动鼠标时。
我设计了应用程序来更新绘图坐标以响应鼠标事件(PaintPanel 类中的 mouseDragged 和 mouseMoved 方法),从而触发重绘来渲染绘图。然而,尽管我付出了努力,我还是注意到快速的鼠标移动有时会导致跳过点,从而导致绘制的线条出现间隙。
这是我的 PaintPanel 类,它管理绘画功能:
public class PaintPanel extends JPanel implements MouseMotionListener{
public Point mouseCoordinates;
boolean painting = false;
public PaintPanel() {
this.setPreferredSize(new Dimension(1000,550));
this.setBackground(Color.white);
this.addMouseMotionListener(this);
}
public void paintComponent(Graphics g) {
Graphics2D g2D = (Graphics2D) g;
g2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
if(painting == false) {
super.paintComponent(g2D);
}
if(mouseCoordinates != null) {
g2D.setColor(UtilePanel.col);
g2D.fillOval((int)mouseCoordinates.getX(),(int)mouseCoordinates.getY(),UtilePanel.brushSize, UtilePanel.brushSize);
this.setCursor( this.getToolkit().createCustomCursor(
new BufferedImage( 1, 1, BufferedImage.TYPE_INT_ARGB ),
new Point(),
null ) );
}
}
@Override
public void mouseDragged(MouseEvent e) {
mouseCoordinates = e.getPoint();
painting = true;
repaint();
}
@Override
public void mouseMoved(MouseEvent e) {
mouseCoordinates = e.getPoint();
repaint();
}
}
此外,我尝试合并一个游戏循环来不断轮询鼠标输入,希望它能够提高鼠标移动捕获的准确性。然而,即使游戏循环到位,问题仍然存在。
我不确定我通过在 PaintComponent 中省略 super.paintComponent(g) 进行绘画的方法是否正确,或者是否有更好的方法。
有人可以提供关于如何改进鼠标事件捕获以保证精确渲染的见解或建议,特别是在鼠标快速移动期间?
我们将非常感谢您的帮助。谢谢!
您会想要: