2017-10-05 138 views
1

我必须在鼠标移动时绘制线条,点击鼠标后,线条应继续绘制直至双击。 说点A,点B和点C,当点击鼠标点A时,应该开始画线。当在点B上点击鼠标时,前导线应该在那里,新线应该从点B开始绘制,除非双击。点C应该是相同的,等等,直到鼠标被双击。经过一番研究,我写了下面的代码,它工作得很好,但它适用于拖动NOT MOUSE MOVE事件,我试图将代码传输到mouseMoved事件,但prev行正在消失。有人可以帮我解决这个问题吗?为每次鼠标点击绘制线条并在双击时停止绘制

public class WorkingLines { 
    public WorkingLines() { 
     JFrame jf = new JFrame("Free Hand Drawing Example"); 

     Board draw = new Board(); 
     jf.add(draw); 
     jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     jf.setSize(600, 500); 
     jf.setVisible(true); 
    } 

    public static void main(String a[]) { 
     new WorkingLines(); 
    } 
} 

class Board extends JPanel implements MouseListener, MouseMotionListener { 
    ArrayList<pts> list = new ArrayList<pts>(); 
    Point start, end; 

    public Board() { 
     start = null; /* Initializing */ 
     end = null; 

     // this.setBackground(Color.BLACK); 
     this.addMouseListener(this); 
     this.addMouseMotionListener(this); 
    } 

    @Override 
    public void paint(Graphics g) { 
     Graphics2D g2 = (Graphics2D) g; 
     g2.setStroke(new BasicStroke(3, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND)); 
     super.paint(g2); 
     // g.setColor(Color.BLACK); 
     for (pts p : list) { 
      System.out.println("Drawing Lines!!!=>"); 
      g.drawLine((int) p.getStart().getX(), (int) p.getStart().getY(), (int) p.getEnd().getX(), 
        (int) p.getEnd().getY()); 
     } 

     if (start != null && end != null) { 
      System.out.println("Drawing happening!!!=>"); 
      g.drawLine(start.x, start.y, end.x, end.y); 
     } 
    } 

    @Override 
    public void mouseClicked(MouseEvent arg0) { 
    } 

    @Override 
    public void mouseEntered(MouseEvent arg0) { 
    } 

    @Override 
    public void mouseExited(MouseEvent arg0) { 
    } 

    @Override 
    public void mousePressed(MouseEvent me) { 
     start = me.getPoint(); 
     System.out.println("Start initialized!!"); 
     for (pts pt : list) { 
      System.out.println("Point x coordinate =>" + pt.start.getX()); 
     } 
     repaint(); 
    } 

    @Override 
    public void mouseReleased(MouseEvent me) { 
     end = me.getPoint(); 
     pts pt = new pts(start, end); 
     list.add(pt); 
     repaint(); 

     if (me.getClickCount() == 2) { 
      start = null; 
      end = null; 
     } 

    } 

    @Override 
    public void mouseDragged(MouseEvent me) { 
     System.out.println("Mouse Moved=>" + start); 
     end = me.getPoint(); 
     repaint(); 
    } 

    @Override 
    public void mouseMoved(MouseEvent me) { 

    } 
} 

class pts { 

    Point start = null; 
    Point end = null; 

    public pts(Point start, Point end) { 
     this.start = start; 
     this.end = end; 
    } 

    public Point getStart() { 
     return this.start; 
    } 

    public Point getEnd() { 
     return this.end; 
    } 

} 

回答

1

注意的标志说:

public class WorkingLines { 

    public WorkingLines() { 
     JFrame jf = new JFrame("Free Hand Drawing Example"); 

     Board draw = new Board(); 
     jf.add(draw); 
     jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     jf.setSize(600, 500); 
     jf.setVisible(true); 
    } 

    public static void main(String a[]) { 
     new WorkingLines(); 
    } 
} 

class Board extends JPanel implements MouseListener, MouseMotionListener { 
    ArrayList<pts> list = new ArrayList<>(); 
    Point start, end; 
    private boolean isDrawing = false; //a flag 

    public Board() { 
     start = null; end = null; /* Initializing */ 
     addMouseListener(this); 
     addMouseMotionListener(this); 
    } 

    @Override 
    public void paint(Graphics g) { 
     Graphics2D g2 = (Graphics2D) g; 
     g2.setStroke(new BasicStroke(3, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND)); 
     super.paint(g2); 

     for (pts p : list) { 
      g.drawLine((int) p.getStart().getX(), (int) p.getStart().getY(), (int) p.getEnd().getX(), 
        (int) p.getEnd().getY()); 
     } 

     if ((start != null) && (end != null)) { 
      g.drawLine(start.x, start.y, end.x, end.y); 
     } 
    } 

    @Override 
    public void mouseClicked(MouseEvent arg0) {} 

    @Override 
    public void mouseEntered(MouseEvent arg0) {} 

    @Override 
    public void mouseExited(MouseEvent arg0) {} 

    @Override 
    public void mousePressed(MouseEvent me) { 

     if(! isDrawing) { 

      start = me.getPoint(); 
      isDrawing = ! isDrawing; 
     }else { 

      pts pt = new pts(start, end); 
      list.add(pt); 
      start = end; 
     } 
    } 

    @Override 
    public void mouseReleased(MouseEvent me) { 

     if (me.getClickCount() == 2) { 
      start = null; 
      end = null; 
      isDrawing = false; 
     } 
    } 

    @Override 
    public void mouseDragged(MouseEvent me) {} 

    @Override 
    public void mouseMoved(MouseEvent me) { 
      end = me.getPoint(); 
      repaint(); 
    } 
} 

class pts { 

    Point start = null, end = null; 

    public pts(Point start, Point end) { 
     this.start = start; 
     this.end = end; 
    } 

    public Point getStart() { return start; } 

    public Point getEnd() { return end; } 
}