title: How do I make a sprite move in a custom JPanel?
body: <p>How do I make a sprite move in a custom <code>JPanel</code>?</p>
  
  <p>I have looked at the similar questions and although one question is similar, it isn't addressing my problem. I have a sprite in a <code>JPanel</code> and I am unable to get it to move. One of the requirements I have to meet for the program is that it must begin moving when a <code>JButton</code> is pressed (<strong>Mouse Click</strong>). I have the code set-up in a way I believe should work, but it will spit out a long list of errors when I press the button. I'm also required to have the panel be a custom panel class. </p>
  
  <p>What I need to know is this:</p>
  
  <ol>
  <li>Methods (ha) of programming sprite movement.</li>
  <li>Continuing to move the sprite without a trail.</li>
  <li><strike>Making the sprite bounce off the edges of the panel.</strike> Done (Unable to test due to no moving ball)</li>
  </ol>
  
  <p>Here's the code I have (<code>MainClient</code>).</p>
  
  <pre><code>package clientPackage;
  
  import java.awt.EventQueue;
  import java.awt.Graphics;
  import java.awt.Graphics2D;
  
  import javax.swing.JFrame;
  import javax.swing.JPanel;
  
  import java.awt.Color;
  import java.awt.event.MouseAdapter;
  import java.awt.event.MouseEvent;
  
  import logicPack.Logic;
  import javax.swing.JButton;
  import java.awt.event.ActionListener;
  import java.awt.event.ActionEvent;
  
  public class ClientClass 
  {
  Ball mSolo = new Ball();
  
  private JFrame frame;
  
  /**
   * Launch the application.
   */
  public static void main(String[] args) {
      EventQueue.invokeLater(new Runnable() {
          public void run() {
              try {
                  ClientClass window = new ClientClass();
                  window.frame.setVisible(true);
              } catch (Exception e) {
                  e.printStackTrace();
              }
          }
      });
  }
  
  /**
   * Create the application.
   */
  public ClientClass() 
  {
      initialize();
  
  }
  
  /**
   * Initialize the contents of the frame.
   */
  Logic Logical;
  Graphics g;
  private void initialize() {
      frame = new JFrame();
      frame.setBounds(100, 100, 590, 520);
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().setLayout(null);
  
      SpriteField panel = new SpriteField();
      panel.addMouseListener(new MouseAdapter() 
      {
  
          public void mouseClicked(MouseEvent e) 
          {
          /*  int tX = e.getX();
              Logical.MoveBallX();
              int tY = e.getY();
              Logical.MoveBallY();
              panel.repaint();*/
              Logical.MoveBallX();
              Logical.MoveBallY();
              panel.repaint();
          }
      });
      panel.setForeground(Color.WHITE);
      panel.setBackground(Color.GRAY);
      panel.setBounds(64, 92, 434, 355);
      frame.getContentPane().add(panel);
  
      JButton btnStart = new JButton("Start");
      btnStart.addActionListener(new ActionListener() {
          public void actionPerformed(ActionEvent e) 
          {
  
              Graphics2D g2 = (Graphics2D)g;
              mSolo.DrawSprite(g2 , Logical.MoveBallX(), Logical.MoveBallY());
          }
      });
      btnStart.setBounds(64, 13, 174, 60);
      frame.getContentPane().add(btnStart);
  }
  }
  </code></pre>
  
  <p>And here are my other Classes (<code>Logic</code>)</p>
  
  <pre><code>package logicPack;
  
  import clientPackage.Ball;
  
  public class Logic 
  {
  Ball mSolo;
  public int MoveBallX()
  {
      int NewX = mSolo.xPos + 50;
      return NewX;
  }
  public int MoveBallY()
  {
      int NewY = mSolo.yPos + 50;
      return NewY;        
  }
  //Motion, force, friction and collision GO HERE ONLY
  
  }
  </code></pre>
  
  <p><code>SpriteField</code></p>
  
  <pre><code>package clientPackage;
  
  import java.awt.Color;
  import java.awt.Graphics;
  import java.awt.Graphics2D;
  
  import javax.swing.JPanel;
  
  public class SpriteField extends JPanel
  {
  Ball mSolo;
  SpriteField()
  {
      mSolo = new Ball();
      repaint();
  }
  
  public void paintComponent(Graphics g)
  {
      super.paintComponent(g);
      Graphics2D g2 = (Graphics2D)g;
      mSolo.DrawSprite(g2 , mSolo.xPos , mSolo.yPos);
  
  }
  
  }
  </code></pre>
  
  <p><code>Ball</code></p>
  
  <pre><code>package clientPackage;
  
  import java.awt.Color;
  import java.awt.Graphics2D;
  
  public class Ball 
  {
  Ball()
  {
  
  }
  public int xPos = 25;
  public int yPos = 25;
  int diameter = 25;
  public void DrawSprite(Graphics2D g2, int xPos, int yPos)
  {
      g2.setColor(Color.BLACK);
      g2.fillOval(xPos - diameter / 2 , yPos - diameter / 2 , diameter , diameter);
  
  }
  
  
  }
  </code></pre>
  
  <p>If you do not understand my Java comments, you can just ignore them.
  If you need more details to help me, let me know.</p>
  
  <p>EDIT 1: 
  Andrew, the closest article I could find used arrow keys to move a sprite. The article was "Sprite not moving in JPanel". All the other articles I found either addressed JPanels without sprites, or animating a sprite. However, I need a JButton that is MouseClicked to simply start the movement, and the ball does not change shape or color. I believe I have the collision part working, but I'm unable to test it until the ball starts moving.</p>
  
  <p>EDIT 2: 
  LuxxMiner, Thanks for the hints. I have refined my collision portion to be a little more accurate using the getHeight and getWidth methods.</p>
  
  <p>EDIT 3:
  MadProgrammer, Thanks...? The problem is not the painting of the ball, I cannot get the ball to move in the first place to repaint it. And the example uses arrow keys, not a mouse click or JButton.</p>