有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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


共 (1) 个答案

  1. # 1 楼答案

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

    我不确定您如何告诉应用程序开始画一条线,所以我使用了mouseClickmouseDragged来生成一个示例,您可以修改它来解决您的问题

    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);
        }
    }
    

    输出: Example output

    编辑:改为使用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);
        }
    }