Java 如何使用mouseMoved从2个鼠标点和角度绘制直线

Java 如何使用mouseMoved从2个鼠标点和角度绘制直线,java,swing,awt,Java,Swing,Awt,当我移动鼠标时,我想在鼠标移动的方向上画一条线,但我不知道怎么做。在移动鼠标时,我不断得到一条以随机长度沿随机方向旋转的线。(它应该在我运行程序并在mouseMoved上取鼠标点时开始绘制)下面是一个使用mouseDragged的示例。mouseMoved和mouseDragged之间的区别在于,当单击鼠标按钮时,mouseMoved将被禁用,而mouseDragged将接管 我不知道你是如何告诉你的应用程序开始画一条线的,所以我使用了鼠标单击和鼠标标记来生成一个例子,你可以修改它来解决你的问题

当我移动鼠标时,我想在鼠标移动的方向上画一条线,但我不知道怎么做。在移动鼠标时,我不断得到一条以随机长度沿随机方向旋转的线。(它应该在我运行程序并在mouseMoved上取鼠标点时开始绘制)

下面是一个使用
mouseDragged
的示例。
mouseMoved
mouseDragged
之间的区别在于,当单击鼠标按钮时,
mouseMoved
将被禁用,而
mouseDragged
将接管

我不知道你是如何告诉你的应用程序开始画一条线的,所以我使用了
鼠标单击
鼠标标记
来生成一个例子,你可以修改它来解决你的问题

import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.Graphics;

public class Angle extends JPanel implements MouseListener, MouseMotionListener {

    boolean pressed = false;
    int origX, origY;
    int currX, currY;
    JPanel p;

    public Angle()
    {
        this.addMouseListener(this);
        this.addMouseMotionListener(this);
    }

    @Override
    public void mousePressed(MouseEvent arg0) {
        System.out.println("Mouse pressed");
        pressed = true;
        origX = arg0.getX();
        origY = arg0.getY();
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawLine(origX, origY, currX, currY);
    }

    @Override
    public void mouseReleased(MouseEvent arg0) {
        pressed = false;
    }

    @Override
    public void mouseDragged(MouseEvent arg0) {
        if (pressed)
        {
            currX = arg0.getX();
            currY = arg0.getY();
            repaint();
            System.out.println(getAngle());
        }
    }

    public double getAngle()
    {
        double xDiff = origX - currX; 
        double yDiff = origY - currY;
        return 180 - Math.toDegrees(Math.atan2(yDiff, xDiff));
    }

    @Override
    public void mouseMoved(MouseEvent arg0) { }
    @Override
    public void mouseClicked(MouseEvent arg0) { }
    @Override
    public void mouseEntered(MouseEvent arg0) { }
    @Override
    public void mouseExited(MouseEvent arg0) {  }

    public static void main(String...args)
    {
        JFrame frame = new JFrame("Frame");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(200, 200);
        frame.add(new Angle());
        frame.setVisible(true);
    }
}
输出:

编辑:改为使用mouseMoved更新

import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.Graphics;

public class Angle extends JPanel implements MouseListener, MouseMotionListener {

    boolean origSet = false;
    int origX, origY;
    int currX, currY;
    JPanel p;

    public Angle()
    {
        this.addMouseListener(this);
        this.addMouseMotionListener(this);
    }

    @Override
    public void mousePressed(MouseEvent arg0) { }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawLine(origX, origY, currX, currY);
    }

    @Override
    public void mouseReleased(MouseEvent arg0) { }

    @Override
    public void mouseDragged(MouseEvent arg0) { }

    public double getAngle()
    {
        double xDiff = origX - currX; 
        double yDiff = origY - currY;
        return 180 - Math.toDegrees(Math.atan2(yDiff, xDiff));
    }

    @Override
    public void mouseMoved(MouseEvent arg0) {
        if (!origSet)
        {
            origX = arg0.getX();
            origY = arg0.getY();
            origSet = true;
        }
        currX = arg0.getX();
        currY = arg0.getY();
        repaint();
        System.out.println(getAngle());
    }
    @Override
    public void mouseClicked(MouseEvent arg0) { }
    @Override
    public void mouseEntered(MouseEvent arg0) { }
    @Override
    public void mouseExited(MouseEvent arg0) {  }

    public static void main(String...args)
    {
        JFrame frame = new JFrame("Frame");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(200, 200);
        frame.add(new Angle());
        frame.setVisible(true);
    }
}

你如何告诉你的线开始画图?你是怎么告诉你的线停止画画的?@SaviourSelf当我运行程序时,我希望它在我移动时画一条线,所以如果我向右移动,它应该向右画一条线,以此类推,所有方向都是这样,而这条线永远不会终止?@SaviourSelf当我改变方向并画出新线时,我将调用repaint,因此,新线被绘制,而旧线不会被绘制。如果是这种情况,使用我的示例,您只需更改
origX
origY
变量,即可在满足绘制新线的条件后重置线的原点。多谢各位,但问题是我只能使用MouseMoved。完全不点击。@如果可以修改为使用
mouseMoved
。需要几分钟。不,还是不行,我还是要点击更改线路。看,给定两个鼠标点和一个角度,画一条具有一定长度和宽度(通常是屏幕大小)的线,这两个点的目的是,如果你有它们,你可以构造一条线,角度提供了方向。@Sherif单击以更改线条在我用鼠标按下的方法编辑代码时被删除。您解决了紧迫的问题,但最终得到了一个固定的起点,这不是我需要的,而且线条应该以固定长度绘制。在您的示例中,如果起点是0,0,终点是5,5,那么直线将从0,0绘制到5,5,我想要的是,如果起点是0,0,终点是5,5,那么直线应该绘制到屏幕的末尾,比如100100