title: How to move Shape in Java?
body: <p>I draw shapes on JPanel in a separate thread. I want to move these shapes via calling method <code>move()</code> but the figure does not change its location.</p>
  
  <p>This my CustomShape</p>
  
  <pre><code>public class CustomShape {
      private static final int Y_STEP = 5;
      private static final int X_STEP = 5;
      public String name;
      public Shape shape;
      public Color color;
      private Point newLocation;
  
      public void move() {
          newLocation.x += X_STEP;
          newLocation.y += Y_STEP;
          //How set new location ?
          //It doesn't work
          this.shape.getBounds().setLocation(newLocation);        
          System.out.println(String.format("New location is [%d,%d]",newLocation.x, newLocation.y));
          System.out.println(String.format("Move to [%d,%d]", this.shape.getBounds().getLocation().x, this.shape.getBounds().getLocation().y));       
      }
  
      public CustomShape(Shape shape, Color color, String name) {
          this.shape = shape;
          this.color = color;
          this.name = name;
          newLocation = this.shape.getBounds().getLocation();
      }
  </code></pre>
  
  <p>Sample output on the console</p>
  
  <pre><code>New location is [15,15]
  Move to [10,10]
  New location is [20,20]
  Move to [10,10]
  New location is [25,25]
  Move to [10,10]
  </code></pre>
  
  <p>My JPanel</p>
  
  <pre><code>public class ViewPanel extends JPanel {
      private static final long serialVersionUID = 5252479726227082794L;
      private List&lt;CustomShape&gt; shapeList = new ArrayList&lt;CustomShape&gt;();
      private Map&lt;String, Thread&gt; threads = new HashMap&lt;String, Thread&gt;();
      private Timer timer;
      private static final int TIMER_SPEED = 1000;
  
      public ViewPanel() {
          super();
          this.setDoubleBuffered(true);
          timer = new Timer(TIMER_SPEED, null);
  
          timer.addActionListener(new ActionListener() {
              @Override
              public void actionPerformed(ActionEvent e) {
                  testMove();
              }
          });
      }
      private void testMove() {
          for (CustomShape shape : shapeList) {
              shape.move();
          }
      }
  
      public void startMove() {
          timer.start();
      }
  
      public void stopMove() {
          timer.stop();
      }
  
      public void addShape(CustomShape shape) {
          shapeList.add(shape);
          if (!threads.containsKey(shape.getName())) {
              Thread t = new Thread(new DrawThread(shape, this.getGraphics()),
                      shape.getName());
              threads.put(shape.getName(), t);
              t.start();
          }
          this.repaint();
      }
  
      public void removeShape(CustomShape shape) {
          if (threads.containsKey(shape.getName())) {
              Thread t = threads.remove(shape.getName());
              t.interrupt();
              shapeList.remove(shape);
          }
          this.repaint();
      }
  }
  </code></pre>
  
  <p>Thread for draw shape</p>
  
  <pre><code>public class DrawThread implements Runnable {
      private static final int THREAD_SLEEP = 100;
      private CustomShape shape;
      private Graphics2D g2d;
      private boolean interrupted = false;
  
      public DrawThread(CustomShape shape, Graphics g) {
          this.shape = shape;
          this.g2d = (Graphics2D)g;
      }
  
      @Override
      public void run() {
          while (true) {
              try {
                  Thread.sleep(THREAD_SLEEP);
                  g2d.setColor(this.shape.getColor());
                  g2d.draw(this.shape.getShape());
              } catch (InterruptedException e) {
                  System.out.println(String.format("interrupt %s", Thread
                          .currentThread().getName()));
                  interrupted = true;
              } finally {
                  if (interrupted)
                      break;
                  }
          }
      }
  }
  </code></pre>