JAVA:mouseDragged getX 和 getY 原始数据不稳定

问题描述

我正在尝试编写类似绘画的程序(为了好玩),但为了挑战自己,我尝试使用 setRGB 方法来完成它,但是我发现当我快速移动鼠标时,笔划的行为变得不稳定,你呢?知道如何“软”从方法 getX 和 getY 获得的数据?或者为什么我得到随机点的颜色

在此先感谢您,并为我的英语感到抱歉。 :)

Stroke fast vs slow

public class Canvas extends JPanel implements ActionListener,MouseMotionListener,MouseListener {

int canvasW;
int canvasH;
BufferedImage imgCanvas;
int X1;
int Y1;
int X0;
int Y0;
int sizeCanvas = 10;
int expcanvas = 2 * sizeCanvas - 1;

public Canvas(int width,int height) {
    canvasH = height;
    canvasW = width;
    setPreferredSize(new Dimension(width,height));
    setBorder(BorderFactory.createLineBorder(Color.black));
    setBackground(Color.white);
    CanvasImage(width,height);
    addMouseListener(this);
    addMouseMotionListener(this);
}

public BufferedImage CanvasImage(int width,int height) {
    imgCanvas = new BufferedImage(width,height,BufferedImage.TYPE_INT_ARGB);
    return imgCanvas;
}

@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2 = (Graphics2D) g;
    g2.drawImage(imgCanvas,null,null);
}

@Override
public void actionPerformed(ActionEvent e) {

}

public void drawer() {
    int deltaX = abs(X1 - X0);
    int deltaY = abs(Y1 - Y0);
    double m;
    double b;

    if (deltaX >= deltaY) {

        if (deltaY == 0) {
            m = 0;
        } else {
            m = (X0 - X1) / (Y0 - Y1);
        }

        b = Y0 - m * X0;
        if (X1 > X0) {
            for (int i = X0; i <= X1; i++) {
                imgCanvas.setRGB(i,(int) (m * i + b),Color.BLACK.getRGB());
                System.out.println(i + " ; " + (int) (m * i + b));
            }

        } else {
            for (int i = X0; i >= X1; i--) {
                imgCanvas.setRGB(i,Color.BLACK.getRGB());
                System.out.println(i + " ; " + (int) (m * i + b));
            }
        }
    } else {

        if (deltaX == 0) {
            m = 0;
        } else {
            m = (Y0 - Y1) / (X0 - X1);
        }
        b = X0 - m * Y0;

        if (Y1 > Y0) {
            for (int i = Y0; i <= Y1; i++) {
                imgCanvas.setRGB((int) (m * i + b),i,Color.BLACK.getRGB());
            }

        } else {
            for (int i = Y0; i >= Y1; i--) {
                imgCanvas.setRGB((int) (m * i + b),Color.BLACK.getRGB());
            }
        }
    }

}

@Override
public void mouseDragged(MouseEvent e) {
    X1 = e.getX();
    Y1 = e.getY();

    drawer();
    repaint();
    X0 = X1;
    Y0 = Y1;
}

@Override
public void mousepressed(MouseEvent e) {
    X0 = e.getX();
    Y0 = e.getY();
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)