在 Java Swing 绘画应用程序中难以捕获快速鼠标移动

问题描述 投票:0回答:1

我目前正在开发我的第一个项目,一个使用 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) 进行绘画的方法是否正确,或者是否有更好的方法。

有人可以提供关于如何改进鼠标事件捕获以保证精确渲染的见解或建议,特别是在鼠标快速移动期间?

我们将非常感谢您的帮助。谢谢!

java swing awt mouselistener
1个回答
0
投票

您会想要:

    首先创建 BufferedImage 和任何绘画方法的
  1. outside。绘画方法应该精简而快速,并且不包含可能在时间或内存方面昂贵的代码,因为不必要地减慢速度会对代码的感知响应能力产生很大影响。
  2. 绘制连接当前点和前一个点的线,而不是点。
© www.soinside.com 2019 - 2024. All rights reserved.