Java 通过两次鼠标单击绘制一条线

Java 通过两次鼠标单击绘制一条线,java,awt,graphics2d,java-2d,mouselistener,Java,Awt,Graphics2d,Java 2d,Mouselistener,我试图从一系列鼠标点击中画出一条线 例如,当我从屏幕上的一个点单击到下一个点时,它会连接线,然后我可以继续单击到下一个点,在那里它会继续绘制一条连续的绘制线 下面是一个例子:在练习2下 我相信我的逻辑中有一些错误,没有画线,只是一个点,但我似乎找不到它 有人能帮我吗 这是我的密码: import javax.swing.*; import java.awt.*; import java.awt.event.MouseAdapter; import java.awt.event.MouseEven

我试图从一系列鼠标点击中画出一条线

例如,当我从屏幕上的一个点单击到下一个点时,它会连接线,然后我可以继续单击到下一个点,在那里它会继续绘制一条连续的绘制线

下面是一个例子:在练习2下

我相信我的逻辑中有一些错误,没有画线,只是一个点,但我似乎找不到它

有人能帮我吗

这是我的密码:

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class RoadCreator extends JPanel {

    private MouseHandler mouseHandler = new MouseHandler();

    private Point previousPoint = new Point();
    private Point nextPoint = new Point();
    private boolean drawing;

    public RoadCreator() {
        this.setPreferredSize(new Dimension(640, 480));
        this.addMouseListener(mouseHandler);
       this.addMouseMotionListener(mouseHandler);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g;
        g2d.setColor(Color.blue);
        g2d.setRenderingHint(
            RenderingHints.KEY_ANTIALIASING,
            RenderingHints.VALUE_ANTIALIAS_ON);
        g2d.setStroke(new BasicStroke(8,
            BasicStroke.CAP_ROUND, BasicStroke.JOIN_BEVEL));
        g.drawLine(previousPoint.x, previousPoint.y, nextPoint.x, nextPoint.y);
    }

    private class MouseHandler extends MouseAdapter {

        @Override
        public void mousePressed(MouseEvent e) {
            drawing = true;
            nextPoint = e.getPoint();
            repaint();
            previousPoint = e.getPoint();

        }
    }

    public void display() {
        JFrame f = new JFrame("Road Creator");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(this);
        f.pack();
        f.setVisible(true);
    }

    }
任何帮助都将不胜感激,谢谢

这行不通

public void mousePressed(MouseEvent e) {
    drawing = true;
    nextPoint = e.getPoint();
    repaint();
    previousPoint = e.getPoint();
}
您假设重新绘制是一个内联调用(即它在返回之前绘制)。否则,重新绘制将向重新绘制管理器排队请求,该管理器将在将来某个时间更新

public void mousePressed(MouseEvent e) {
    drawing = true;
    previousPoint = nextPoint
    nextPoint = e.getPoint();
    repaint();
}
如果可以工作,请注意,在用户再次单击之前,previousPoint将为null。

请改用a或Path2D

GeneralPath类表示由直线、二次和三次Bézier曲线构成的几何路径。它可以包含多个子路径


我已经找到了一种尽可能省力地完成这项任务的方法。但是,这并不等同于创建应用程序的好方法。您需要考虑将来的可伸缩性,例如绘制其他对象的能力……等等。所以,让我们开始讨论如何让它发挥作用

1让我们省略paintComponent方法…我认为这应该是paint

    //@Override
    /*protected void paintComponent(Graphics g) {
         //Do Something...
      }*/
2让我们添加此方法:

    public void drawLineHelper(Point prev, Point next){
        Graphics g = getGraphics();
        g.setColor(Color.blue);
        g.drawLine(previousPoint.x, previousPoint.y, nextPoint.x, nextPoint.y);
    }
3最后,我们需要对mouseHandler类进行一些更改:

   private class MouseHandler extends MouseAdapter {
        //twoPoints make sure we have two points.
        boolean twoPoints=false;

        @Override
        public void mousePressed(MouseEvent e) {
            if(twoPoints==false){
                nextPoint = e.getPoint();
                twoPoints = true;
            }
            else{
                //Set previous to next from now on.
                previousPoint = nextPoint;

                //Get a new next point.
                nextPoint = e.getPoint();

                //Helper method will draw the line each time.
                drawLineHelper(previousPoint,nextPoint);
                //repaint() no longer necessary.

            }
        }
    }

下面是对另一个具有相同问题的示例的快速参考。页面上的最后一篇文章解释了同样的方法:

可能正在执行nextPoint=e.getPoint;和上一个点=e.getPoint;每次e.getPoint调用都会得到相同的分数。您是否尝试过previousPoint=nextPoint;然后nextPoint=e.getPoint;?previousPoint不会为null,因为它已初始化:私有点previousPoint=新点;,但它没有任何可靠的坐标。确实,应该检查它是否是第一次鼠标点击。是的,这是我想要的,但是否可以继续添加到现有行,而不是每次添加新行?
   private class MouseHandler extends MouseAdapter {
        //twoPoints make sure we have two points.
        boolean twoPoints=false;

        @Override
        public void mousePressed(MouseEvent e) {
            if(twoPoints==false){
                nextPoint = e.getPoint();
                twoPoints = true;
            }
            else{
                //Set previous to next from now on.
                previousPoint = nextPoint;

                //Get a new next point.
                nextPoint = e.getPoint();

                //Helper method will draw the line each time.
                drawLineHelper(previousPoint,nextPoint);
                //repaint() no longer necessary.

            }
        }
    }