在第一次鼠标点击和光标之间显示一条线

Show a line between first mouse click and cursor

我正在尝试编写一个程序,在第一次单击后显示第一次单击和鼠标位置之间的一条线。然后在第二次点击后,它显示了一条线。

我知道我将不得不使用 MouseListener getX(), getY() 来获取鼠标点击的位置,但我感到困惑的部分是显示一个第一次单击和鼠标位置之间的线,然后在第二次单击后显示一条线。我在网上找到的教程只教我如何在两次鼠标点击之间画一条线。

如果有人能指出正确的方向,我将不胜感激。

你需要知道三点。

  • 第一个点击点
  • 第二次点击点
  • 当前鼠标点

如果第一次和第二次点击点都是null,那基本什么都不做

如果第一个点击点和当前鼠标点不是null而第二个点是null,则在第一个点和过渡点之间画一条线

如果第一个和第二个点击点都不是null,则在这两个点之间画一条线

要完成这项工作,您需要 MouseListener and a MouseMotionListener

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.Line2D;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame();
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private Point startPoint;
        private Point endPoint;
        private Point transientPoint;

        public TestPane() {
            MouseAdapter ma = new MouseAdapter() {
                @Override
                public void mouseClicked(MouseEvent e) {
                    if (startPoint == null) {
                        startPoint = e.getPoint();
                    } else if (endPoint == null) {
                        endPoint = e.getPoint();
                    } else {
                        endPoint = null;
                        startPoint = e.getPoint();
                    }
                    repaint();
                }

                @Override
                public void mouseMoved(MouseEvent e) {
                    if (startPoint != null && endPoint == null) {
                        transientPoint = e.getPoint();
                        repaint();
                    } else {
                        transientPoint = null;
                    }
                }
            };

            addMouseListener(ma);
            addMouseMotionListener(ma);
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(400, 400);
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g.create();
            if (startPoint != null && endPoint != null) {
                g2d.setColor(Color.BLUE);
                g2d.draw(new Line2D.Double(startPoint, endPoint));
            } else if (startPoint != null && transientPoint != null) {
                g2d.setColor(Color.RED);
                g2d.draw(new Line2D.Double(startPoint, transientPoint));
            }
            g2d.dispose();
        }

    }
}