2017-10-05 15 views
1

マウスを動かすと線を描く必要があります。マウスをクリックした後、線をダブルクリックするまで描画し続ける必要があります。 点A、点B、点Cをクリックします。点Aでマウスをクリックすると、線の描画が開始されます。ポイントBでマウスをクリックすると、ダブルクリックされない限り、ポイントBから描画を開始する必要がある新しいラインがそこにあるはずです。マウスをダブルクリックするまで、点Cと同じでなければなりません。いくつかの研究の後、私はコードの下に書いたが、それは完全に正常に動作しますが、MOUSE MOVEイベントをドラッグするために働く、私はmouseMovedイベントにコードを転送しようとしましたが、前の行は消えています。誰かが私にこれを解決させる手助けはできますかダブルクリックしたときに、マウスクリックごとに線を引いて描画を停止

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; } 
} 
関連する問題