title: Drawing a line using a Mouse Motion Listener
body: <p>I'm new at using <code>actionListener</code> and <code>mouselistner</code>. I want to track the Mouse movements and connect the dots as I go. So it will be one continuous line. I am using the <code>MouseMotionListener</code> every time I move the mouse across the screen and get a new set of points. I am not using <code>mousePressed</code> or <code>mouseReleased</code>. </p>
  
  <p>Everytime I move the mouse, I can get every point of where my mouse's position is on my <code>JPanel</code> to show up on my results window, but in order to draw the line between two points, I'm not sure how to decipher between each different set of points so I can have a beginning and ending set of points to use for drawing a line? I checked through here and the API and I'm stuck.</p>
  
  <p>I was asked to put more code and so I gave you my code. </p>
  
  <p>I am basically creating a Jpane that tracks mouse movement when the <strong>Track Mouse</strong> button or <strong>Draw Track</strong> Radio button is pressed
  These results will print out as (x,y) on the output screen</p>
  
  <p>FYI: You can also draw circles once the <strong>Draw circles</strong> RadioButton is checked</p>
  
  <p><img src="https://i.stack.imgur.com/B6iIq.jpg" alt="Jpanel">
  <img src="https://i.stack.imgur.com/7Lk9L.jpg" alt="Output"></p>
  
  <pre><code>import javax.swing.*;
  import javax.swing.event.*;
  import java.awt.*;
  import java.awt.event.*;
  import java.util.ArrayList;
  
  public class MouseTest {
  
  private JFrame frame;
  private boolean tracking;
  private boolean drawing;
  private boolean connectdots;
  private int xstart;             
  private int ystart;             
  private int xend;   
  private int y;              
  private int x;  
  private int yend;               
  private int borderWidth = 5;    
  String drawCircles = "Draw Circles";
  String drawTrack = "Draw Track";
  
  public static void main (String [] arg) {
      MouseTest first = new MouseTest(); 
  }//main
  </code></pre>
  
  <p>$</p>
  
  <pre><code>public MouseTest() {
      tracking = false; 
      frame = new JFrame(); 
      frame.setBounds(250,98,600,480);
      frame.setTitle("Window number three");
      Container cp = frame.getContentPane();
      JButton track = new JButton("Track Mouse");
      track.addActionListener(new ActionListener() {    
  
          public void actionPerformed(ActionEvent ae) {
              trackMouse();
          }
      });
  
      JPanel top = new JPanel();
      top.add(track);
      cp.add(top,BorderLayout.NORTH);
  
      MyPanel pane = new MyPanel();
  
      cp.add(pane,BorderLayout.CENTER);
      pane.addMouseListener(new MouseAdapter() {
          public void mousePressed(MouseEvent e) {
              xstart = e.getX();
              ystart = e.getY();
          }
          public void mouseReleased(MouseEvent e) {
              xend = e.getX();
              yend = e.getY();
              if (xend &lt; xstart) { int tmp = xstart; xstart = xend; xend = tmp; } 
              if (yend &lt; ystart) { int tmp = ystart; ystart = yend; yend = tmp; } 
              frame.repaint();
          }
      });
      pane.addMouseMotionListener(new MouseMotionAdapter() { 
          public void mouseMoved(MouseEvent e) { 
              if (tracking) { 
                  x = e.getX();  
                  y = e.getY();
                  msg("(" + x + ", " + y + ")");
              }
          }
      });
  
      JRadioButton circleButton = new JRadioButton(drawCircles);
      circleButton.setMnemonic(KeyEvent.VK_B);
      circleButton.setActionCommand(drawCircles);
      circleButton.setSelected(false);
  
      JRadioButton trackButton = new JRadioButton(drawTrack);
      trackButton.setMnemonic(KeyEvent.VK_C);
  
      ButtonGroup group = new ButtonGroup();
      group.add(circleButton);
      group.add(trackButton);
  
      JPanel radioPanel = new JPanel(new GridLayout(2,0)); 
      radioPanel.add(circleButton);
      radioPanel.add(trackButton);    
      cp.add(radioPanel,BorderLayout.EAST);
      drawing = false;
      connectdots = false;
  
      circleButton.addActionListener(new ActionListener() { //Set drawing to true when the button is clicked
          public void actionPerformed(ActionEvent ae) {
              tracking = !tracking;
              drawCircles();
          }
      });
  
      trackButton.addActionListener(new ActionListener() { //Set drawing to true when the button is clicked
          public void actionPerformed(ActionEvent ae) {
              drawing = false;
              tracking = true;
              connectDots();
          }   
      });
  
      frame.setVisible(true);
  }//constructor
  </code></pre>
  
  <p>$</p>
  
  <pre><code>public void trackMouse() {  
          tracking = !tracking;
  }//trackMouse
  
  public void msg(String s) { //new method to simplify the system.out.print method
      System.out.println(s);
  }
  
  public void drawCircles() { 
      drawing = true;
  
  }//Allow Drawing of Circles
  
  public void connectDots() { 
      connectdots = !connectdots;
  
  }//Trying to use for connecting the mouse motion listener points when tracking
  </code></pre>
  
  <p>$</p>
  
  <pre><code>public class MyPanel extends JPanel {        
  
      ArrayList&lt;Circle&gt; circles = new ArrayList&lt;Circle&gt;();
  
  
  public void paintComponent(Graphics g) {
  
      int width  = this.getWidth();
      int height = this.getHeight();
  
      msg("H = " + height + ",  w = " + width);
      g.setColor(Color.BLACK);
      Circle c = new Circle(xstart, ystart);   
  
      circles.add(c);
      if (drawing){  
          for(int k=0; k&lt;circles.size(); k++){
              circles.get(k).draw(g);
          }
      }           // draw the circle
  
      if (connectdots &amp;&amp; tracking) { //trying to use for drawing the lines
          g.drawLine(x,y,x,y);
      }
  
      for (int delta = 0; delta &lt; borderWidth; delta++) {
  
          g.drawRect(delta,delta,width-(2*delta),height-(2*delta));
  
      }
      if (xstart != xend || ystart != yend) {    
          int red     = (int)(256*Math.random());
          int green   = (int)(256*Math.random());
          int blue    = (int)(256*Math.random());
          g.setColor(new Color(red, green, blue));
          msg("Colors are:  " + red + " - " + green + " - " + blue );
          msg("Drawing from: (" + xstart + ", " + ystart + ") to (" + xend + ", " + yend + ")");
          msg("Width is " + (xend-xstart) + " -  Height is " + (yend-ystart));
          g.fillRect(xstart,ystart,xend-xstart,yend-ystart);
      }
  
  }
  }
  }
  </code></pre>
  
  <p>$</p>
  
  <pre><code>public class Circle {
  
  // instance variables:
  int radius;  //random radius
  int x, y;  // coords of the center point
  private Graphics g;
  
  
  public Circle(int xIn, int yIn) {
      radius = (int)(127*Math.random());
      x = xIn;
      y = yIn;
  
  }    
  
  public void draw(Graphics g){
      g.drawOval(x-radius, y-radius, radius, radius);
      g.fillOval(x-radius, y-radius, radius, radius);
      int red     = (int)(256*Math.random());
      int green   = (int)(256*Math.random());
      int blue    = (int)(256*Math.random());
      g.setColor(new Color(red, green, blue));
  }
  
  public int getX(int xstart) {
      // TODO Auto-generated method stub
      return x;
  }
  
  public int getY(int ystart) {
      // TODO Auto-generated method stub
      return y;
  }
  }
  </code></pre>