title: Change Color of bouncing Ball in a running Thread
body: <p>I am new to Java. I started to learn by creating a bouncing ball GUI.</p>
  
  <p>I have managed to do all i wanted to do with it except one thing. I can't get the ball to change its color whenever it bounces off the Frame Borders. </p>
  
  <p>I know i can't use getGraphics for drawing but in this case i can also not use the paint Method as i already use it for the initial settings at the beginning of the Program. If i call the paint method from within the loop, it does change the color but all the JButtons in the North Side of the Layout mysteriously vanish.</p>
  
  <p>The one Thing that makes the whole thing even more complicated for me is the fact that i am looping the ball bounce in a void run method of the Runnable Interface. </p>
  
  <p>I couldn't figure out how to solve it elsewise.</p>
  
  <p>You Guys can copy my code in your IDE. The one thing that doesn't work is that the ball remains black and doesn't changes it'S color. Everything else is running fine.</p>
  
  <p>So Please help me figure out how i can change the ball's color whenever it bounces. </p>
  
  <p>Thanks</p>
  
  <p>Code:</p>
  
  <pre><code>import java.awt.*;
  import java.awt.event.*;
  import javax.swing.*;
  
  public class Ball extends JFrame implements Runnable, ActionListener {
  
      private JButton start;
      private JButton stop;
      private JButton fast;
      private JButton slow;
      private JButton reset;
      private int ball_x;
      private int ball_y;
      private int dx = 10;
      private int dy = 20;
      private int size = 50;
      private boolean active;
      private int i = 20;
      private int R = 255;
      private int G = 0;
      private int B = 255;
      private Color rgb;
  
  
      private MyPanel screen;
  
      private class MyPanel extends JPanel {
          public void paintComponent(Graphics g) {
              super.paintComponent(g);
              ball_x = screen.getWidth() / 2 - 25;
              ball_y = screen.getHeight() / 2 - 25;
              i = 20;
              g.setColor(rgb);
              g.fillOval(ball_x, ball_y, size, size);
          }
  
          public void clr() {
  
              if (R &lt;= 10) {
                  R = 255;
              }
              R = R - 10;
  
  
              if (G &gt;= 255) {
                  G = 0;
              }
  
              G = G + 15;
  
  
              if (B &lt;= 20) {
                  B = 255;
              }
  
              B = B - 20;
  
          }
      }
  
  
      public void start() {
          active = true;
          start.setText("Start");
          start.setEnabled(false);
          start.setText("Jumping...");
          Thread th = new Thread(this); // Thread anlegen
          th.start(); // Thread starten
      }
  
      public void stop() {
          if (active) {
              start.setText("Continue");
          }
          active = false;
          start.setEnabled(true);
      }
  
      public void reset() {
          active = false;
          size = 50;
          screen.repaint();
          start.setText("Start");
          start.setEnabled(true);
      }
  
      public void slow() {
          i = i + 2;
          if (i &gt;= 60) {
              i = 60;
          }
      }
  
      public void fast() {
          i = i - 2;
          if (i &lt;= 5) {
              i = 5;
          }
      }
  
      public void actionPerformed(ActionEvent ereignis) {
  
          if (ereignis.getSource() == start) {
              start();
          }
  
          if (ereignis.getActionCommand() == "G+") {
              fast();
          }
  
          if (ereignis.getActionCommand() == "G-") {
              slow();
          }
  
          if (ereignis.getActionCommand() == "Reset") {
              reset();
          }
  
          if (ereignis.getActionCommand() == "Pause") {
              stop();
          }
  
      }
  
      public Ball() {
  
          this.setTitle("Jumping Ball \u00a9 The One");
          Container panel = new Container();
          panel.setLayout(new BorderLayout());
          JPanel subpanel = new JPanel();
          //subpanel.setLayout(new GridLayout());
          screen = new MyPanel();
          this.setVisible(true);
          this.setSize(1366, 768);
          this.setContentPane(panel);
          this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          start = new JButton("Start");
          fast = new JButton("G+");
          slow = new JButton("G-");
          reset = new JButton("Reset");
          stop = new JButton("Pause");
          subpanel.add(start);
          subpanel.add(fast);
          subpanel.add(slow);
          subpanel.add(reset);
          subpanel.add(stop);
          panel.add(subpanel, "North");
          panel.add(screen, "Center");
          start.addActionListener(this);
          stop.addActionListener(this);
          reset.addActionListener(this);
          slow.addActionListener(this);
          fast.addActionListener(this);
  
      }
  
      public void run() {
  
          while (active) {
              screen.getGraphics().clearRect(ball_x, ball_y, size, size);
  
              if (ball_x &gt; (screen.getWidth() - 30) || ball_x &lt; 25) {
                  dx = -dx;
                  size = size + 3;
                  screen.clr();
  
              }
  
              if (ball_y &gt; (screen.getHeight() - 30) || ball_y &lt; 25) {
                  dy = -dy;
                  size = size + 3;
                  screen.clr();
  
              }
  
              ball_x = ball_x + dx;
              ball_y = ball_y + dy;
  
              rgb = new Color(R, G, B);
  
              screen.getGraphics().setColor(rgb);
              screen.getGraphics().fillOval(ball_x, ball_y, size, size);
              try {
                  Thread.sleep(i);
              } catch (InterruptedException x) {
                  x.printStackTrace();
              }
          }
  
      }
  
  
      public static void main(String[] args) {
          Ball bouncer = new Ball();
  
      } // End of Method Main
  
  
  }
  </code></pre>
  
  <p>Thank You</p>