title: Ball Animation in Swing
body: <p>The Problem is when I resize the <code>JFrame</code> the animation goes on with it's Pre supplied dimensions for <code>JComponent</code> . Is there a way that I can update my <code>width</code> and <code>height</code> variables as I resize the <code>JFrame</code>, so that the Animation can run along with the new Co-ordinates. </p>
  
  <p>In simpler terms, say the <code>JComponent</code> has initial <code>width = 300</code> and <code>height = 300</code>, so the <code>BALL</code> moves inside these specified <code>Co-ordinates</code>. Now if I resize my <code>JFrame</code>, the size for the <code>JComponent</code> still remains as is i.e. <code>width = 300</code> and <code>height = 300</code>, but what I was hoping for, is a way to modify these variables with the present size of the window. Do let me know if I lack something in explaining my issue.</p>
  
  <p>Here is the code that I am using : </p>
  
  <pre><code>import javax.swing.*;
  import java.awt.*;
  import java.awt.event.*;
  
  public class BallAnimation
  {
      private int x;
      private int y;
      private int count;
      private int width;
      private int height;
      private int speedValue;
      private boolean flag;
      /*
       * These variables are used to keep track of 
       * the ball, either it is going LEFT or RIGHT
       * depending on that, we will set the 
       * Co-ordinates.
       */
      private boolean toLeft, toRight;
  
      private boolean fromTop, fromBottom;
  
      private Timer timer;
  
      private JButton button;
  
      private ActionListener actionTimer; 
      private ActionListener buttonAction;
  
      public BallAnimation()
      {
          x = y = count = 0;
          flag = toLeft = false;
          toRight = true;
          fromTop = true;
          fromBottom = false;
          speedValue = 5;
      }
  
      public static void main(String args[])
      {
          Runnable runnable = new Runnable()
          {
              public void run()
              {
                  BallAnimation animation = new BallAnimation();
                  animation.go();
              }
          };      
          SwingUtilities.invokeLater(runnable);
      }
  
      public void go()
      {
          JFrame frame = new JFrame();
          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  
          //JPanel contentPane = new JPanel();
  
          /*
           * Class Name : 
           * Java Naming Convention says that class names 
           * should be in Pascal Case, i.e. the first
           * letter of the class name should be capitalized
           * and every new word must start with a capitalized 
           * Alphabet.
           * For Example : 
           * public class ClassName{...}
           * ----------------------------------------------------------
           * Variable Name : 
           * Java Naming Convention says that the variable name
           * should be in Camel Case, i.e. the first letter of 
           * the variable name should be small case or _ (underscore)
           * and every new word must start with a capitalized
           * Alphabet.
           * ---------------------------------------------------------
           */
          final MyDraw drawPanel = new MyDraw(0, 0);
          x = drawPanel.getXValue();
          y = drawPanel.getYValue();
          //contentPane.add(drawPanel);
  
          actionTimer = new ActionListener()
          {
              public void actionPerformed(ActionEvent ae)
              {               
                  if (fromTop &amp;&amp; !fromBottom &amp;&amp; x &lt; width &amp;&amp; y &lt; height 
                              &amp;&amp; toRight &amp;&amp; !toLeft)
                  {
                      x += speedValue;
                      y += speedValue;
                  }
                  else if (fromTop &amp;&amp; !fromBottom &amp;&amp; x &lt; width &amp;&amp; y &gt;= height
                                   &amp;&amp; toRight &amp;&amp; !toLeft)
                  {
                      /*
                       * Since the ball coming from the TOP LEFT Side
                       * touched the BOTTOM of the JPanel.
                       */
                      y -= speedValue;
                      x += speedValue;
                      fromTop = false;
                      fromBottom = true;
                  }
                  else if (!fromTop &amp;&amp; fromBottom &amp;&amp; x &lt; width &amp;&amp; y &lt;= 0
                                    &amp;&amp; toRight &amp;&amp; !toLeft)
                  {
                      /*
                       * Since the ball coming from BOTTOM LEFT Side
                       * touched the TOP of the JPanel. 
                       */
                      fromTop = true;
                      fromBottom = false;
                      x += speedValue;
                      y += speedValue;
                  }
                  else if (!fromTop &amp;&amp; fromBottom &amp;&amp; x &lt; width &amp;&amp; y &lt; height
                                    &amp;&amp; toRight &amp;&amp; !toLeft)
                  {
                      x += speedValue;
                      y -= speedValue;
                  }
                  else if (!fromTop &amp;&amp; fromBottom &amp;&amp; x &gt;= width &amp;&amp; y &lt; height
                                    &amp;&amp; toRight &amp;&amp; !toLeft)
                  {
                      /*
                       * Since the ball coming from the BOTTOM LEFT Side
                       * touched the RIGHT Side of the JPanel.
                       */
                      toRight = false;
                      toLeft = true;
                      x -= speedValue;
                      y -= speedValue;
                  }                
                  else if (!fromTop &amp;&amp; fromBottom &amp;&amp; x &lt; width &amp;&amp; y &lt;= 0
                                    &amp;&amp; !toRight &amp;&amp; toLeft)
                  {
                      /*
                       * Since the ball coming from the BOTTOM RIGHT Side
                       * touched the Top Side of the JPanel.
                       */
                      fromTop = true;
                      fromBottom = false;
                      x -= speedValue;
                      y += speedValue;
                  }
                  else if (fromTop &amp;&amp; !fromBottom &amp;&amp; x &lt;= 0 &amp;&amp; y &lt; height
                                   &amp;&amp; !toRight &amp;&amp; toLeft)
                  {
                      /*
                       * Since the ball coming from the TOP RIGHT Side
                       * touched the LEFT Side of the JPanel.
                       */
                      toRight = true;
                      toLeft = false;
                      x += speedValue;
                      y += speedValue;
                  }
                  else if (fromTop &amp;&amp; !fromBottom &amp;&amp; x &gt;= width &amp;&amp; y &lt; height
                                    &amp;&amp; toRight &amp;&amp; !toLeft)
                  {
                      /*
                       * Since the ball coming from the TOP LEFT Side
                       * touched the RIGHT Side of the JPanel
                       */
                      toRight = false;
                      toLeft = true;
                      x -= speedValue;
                      y += speedValue;
                  }
                  else if (fromTop &amp;&amp; !fromBottom &amp;&amp; x &lt; width &amp;&amp; y &lt; height
                                    &amp;&amp; !toRight &amp;&amp; toLeft)
                  {
                      x -= speedValue;
                      y += speedValue;
                  }
                  else if (!fromTop &amp;&amp; fromBottom &amp;&amp; x &lt;= 0 &amp;&amp; y &lt; height
                                    &amp;&amp; !toRight &amp;&amp; toLeft)
                  {
                      /*
                       * Since the ball coming from the BOTTOM RIGHT Side
                       * touched the LEFT Side of the JPanel.
                       */
                      toRight = true;
                      toLeft = false;
                      x += speedValue;
                      y -= speedValue;
                  }
                  else if (!fromTop &amp;&amp; fromBottom &amp;&amp; x &lt; width &amp;&amp; y &lt; height
                                    &amp;&amp; !toRight &amp;&amp; toLeft)
                  {
                      x -= speedValue;
                      y -= speedValue;
                  }
                  else if (fromTop &amp;&amp; !fromBottom &amp;&amp; x &lt; width &amp;&amp; y &gt;= height
                                    &amp;&amp; !toRight &amp;&amp; toLeft)
                  {
                      /*
                       * Since the ball coming from the TOP RIGHT Side
                       * touched the BOTTOM Side of the JPanel.
                       */
                      fromTop = false;
                      fromBottom = true;
                      x -= speedValue;
                      y -= speedValue;
                  }
                  System.out.println("X : " + x);
                  System.out.println("Y : " + y);
                  System.out.println("Direction is LEFT : " + toLeft);
                  System.out.println("Direction is RIGHT : " + toRight);
                  System.out.println("Coming from TOP : " + fromTop);
                  System.out.println("Coming from BOTTOM : " + fromBottom);
                  drawPanel.setXYValues(x, y);
              }
          };
  
          buttonAction = new ActionListener()
          {
              public void actionPerformed(ActionEvent ae)
              {
                  if (!flag)
                  {
                      timer.start();
                      button.setText("STOP ANIMATION");
                      flag = true;
                  }
                  else if (flag)
                  {
                      timer.stop();
                      button.setText("START ANIMATION");
                      flag = false;
                  }
              }
          };
  
          button = new JButton("START ANIMATION");
          button.addActionListener(buttonAction);
  
          frame.getContentPane().add(drawPanel, BorderLayout.CENTER);
          frame.getContentPane().add(button, BorderLayout.PAGE_END);
          frame.setSize(300, 300);
          //frame.pack();
          frame.setVisible(true);        
  
          timer = new Timer(40, actionTimer);
          width = drawPanel.getWidth() - 30;
          System.out.println("WIDTH : " + width);
          height = drawPanel.getHeight() - 30;    
          System.out.println("HEIGHT : " + height);
      }
      class MyDraw extends JComponent
      {
          private int x;
          private int y;
          private Timer timer;
  
          public MyDraw(int x, int y)
          {
              this.x = x;
              this.y = y;
          }
  
          public int getXValue()
          {
              return x;
          }
  
          public int getYValue()
          {
              return y;
          }
  
          public void setXYValues(int x, int y)
          {
              this.x = x;
              this.y = y;
              repaint();
          }
  
          public Dimension getPreferredSize()
          {
              return (new Dimension(300, 300));
          }
  
          public void paintComponent(Graphics g)
          {
              g.setColor(Color.WHITE);
              g.fillRect(0, 0, getWidth(), getHeight());
              g.setColor(Color.BLUE);
              g.fillOval(x, y, 40, 40);
          }
      }
  }
  </code></pre>