title: How to correctly show a JFrame after initializing it in a method
body: <p>This is a long question, so bear with me for a minute. I'm making a Game of Life application which first shows a JFrame with a grid of JButtons. If you click on a JButton its background turns black and when activated again, its background turns back to white. My code:</p>
  
  <pre><code>public class Choose implements ActionListener {
  public final static int DIMENSION = 50;
  Color BLACK = new Color(0,0,0);
  Color WHITE = new Color(255,255,255);
  JFrame choose;
  JButton[] choice;
  JButton clear, fill, go;
  JPanel baseChoose, baseFrame, buttonsAndText;
  GridLayout base;
  
  public Choose() {
      choose = new JFrame("Make your own game");
      choice = new JButton[DIMENSION*DIMENSION];
  
      baseChoose = new JPanel();
          baseChoose.setSize(500, 500);
      buttonsAndText = new JPanel();
  
      buttonsAndText.add(clear = new JButton("Clear"));
          clear.addActionListener(this);
      buttonsAndText.add(fill = new JButton("Fill"));
          fill.addActionListener(this);
      buttonsAndText.add(go = new JButton("Go"));
          go.addActionListener(this);
  
      base = new GridLayout(DIMENSION, DIMENSION);
          base.setHgap(-1);
          base.setVgap(-1);
  
      baseChoose.setLayout(base);
      choose.add(baseChoose);
      choose.add(buttonsAndText);
  
      JLabel text = new JLabel("Press 'Go' to start.");
      buttonsAndText.add(text);
  
      for (int i = 0; i &lt; (DIMENSION*DIMENSION); i++) {
          baseChoose.add(choice[i] = new JButton());
          choice[i].setBackground(WHITE);
          choice[i].addActionListener(this);
      }
  
      choose.setSize(500, 800);
      choose.setVisible(true);
      choose.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      choose.setResizable(false);
  }
  
  public void actionPerformed(ActionEvent e) {
      JButton b = (JButton)e.getSource();
  
      for (int i = 0; i &lt; (DIMENSION*DIMENSION); i++) {
          if (b == choice[i]) {
              if (b.getBackground() == BLACK) {
                  choice[i].setBackground(WHITE);
              } else if (b.getBackground() == WHITE) {
                  choice[i].setBackground(BLACK);
              }
          }
      }
  
      if (b == clear) {
          for (int i = 0; i &lt; (DIMENSION*DIMENSION); i++) {
              choice[i].setBackground(WHITE);
          }
          choose.validate();
          choose.repaint();
      }
  
      if (b == fill) {
          for (int i = 0; i &lt; (DIMENSION*DIMENSION); i++) {
              choice[i].setBackground(BLACK);
          }
          choose.validate();
          choose.repaint();
      }
  
      if (b == go) {
          int states[] = new int[DIMENSION*DIMENSION];
          for (int i = 0; i &lt; DIMENSION*DIMENSION; i++) {
              System.out.println(choice[i].getBackground() == BLACK);
              if (choice[i].getBackground() == BLACK) {
                  states[i] = 1;
              } else if (choice[i].getBackground() == WHITE) {
                  states[i] = 0;
              }
          }
          choose.dispose();
          Gui own = new Gui(states);
      }
  }
  }
  </code></pre>
  
  <p>In the main method I make an instance of this class, when you have chosen your buttons to activate, you can click the <code>go</code> button to actually show the Game of Life.</p>
  
  <pre><code>public class Gui  {
  public final static int DIMENSION = 50;
  Color BLACK = new Color(0,0,0);
  Color WHITE = new Color(255,255,255);
  JFrame frame, ownFrame;
  JPanel baseFrame;
  GridLayout base;
  
  public Gui(int[] states) {
      frame = new JFrame("Game of Life by Boris Verwoerd");
  
      baseFrame = new JPanel();
          baseFrame.setSize(500, 500);
  
      frame.add(baseFrame);
  
      base = new GridLayout(DIMENSION, DIMENSION);
          base.setHgap(-1);
          base.setVgap(-1);
  
      baseFrame.setLayout(base);
  
      JPanel[] box = new JPanel[DIMENSION*DIMENSION];
  
      for (int i = 0; i &lt; (DIMENSION*DIMENSION); i++) {
          baseFrame.add(box[i] = new JPanel());
          box[i].setBorder(BorderFactory.createLineBorder(Color.black));
      }
  
      frame.setSize(500, 500);
      frame.setVisible(true);
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.setResizable(false);
      frame.validate();
      frame.repaint();
  
      gameLoop(box, frame, states);
  }
  
  private static void gameLoop(JPanel[] boxes, JFrame theFrame, int[] states) {
      int[] newstates = new int[DIMENSION*DIMENSION];
      for (int i = 0; i &lt; 20; i++) {
  
          newstates = Maths.render(boxes, theFrame, states);
          states = newstates;
          theFrame.validate();
          theFrame.repaint();
  
          try {
              Thread.sleep(100);                 //1000 milliseconds is one second.
          } catch(InterruptedException ex) {
              Thread.currentThread().interrupt();
          }
      }
  }
  
  public static int getDim() {
      return DIMENSION;
  }
  
  }
  </code></pre>
  
  <p>When pressing go, a new JFrame launches but the screen is totally white, only after the gameLoop has ended it shows the JPanel grid.</p>
  
  <p>Only when I make an instance of Gui from the main method with an all zero array <code>states</code> it shows it correctly.
  I've tried so many things to come up with a solution but I can't understand why it causes this white screen instead of the Grid. Hence my question is: How can I show my instance of Gui correctly, without the white screen when initialized from a method?</p>
  
  <ul>
  <li>Sorry for the long post/code! </li>
  </ul>
  
  <p>Edit:</p>
  
  <p>This is my Maths class:</p>
  
  <pre><code>public class Maths {
  static Color BLACK = new Color(0,0,0);
  static Color WHITE = new Color(255,255,255);
  
  public static int[] render(JPanel[] box, JFrame frame, int[] state) {
      int[] newstates = new int[Gui.getDim()*Gui.getDim()];
      for (int i = 0; i &lt; (Gui.getDim()*Gui.getDim()); i++) newstates[i] = 0;
  
      for (int i = (Gui.getDim()+1); i &lt; (Gui.getDim()*Gui.getDim() - (Gui.getDim()+1)); i++) {
          if (state[i] == 1) {
              int aliveNeighbours = 0;
              if (state[i-(Gui.getDim()+1)] == 1) aliveNeighbours++;
              if (state[i-Gui.getDim()] == 1) aliveNeighbours++;
              if (state[i-(Gui.getDim()-1)] == 1) aliveNeighbours++;
              if (state[i-1] == 1) aliveNeighbours++;
              if (state[i+1] == 1) aliveNeighbours++;
              if (state[i+(Gui.getDim()-1)] == 1) aliveNeighbours++;
              if (state[i+Gui.getDim()] == 1) aliveNeighbours++;
              if (state[i+(Gui.getDim()+1)] == 1) aliveNeighbours++;
  
              if (aliveNeighbours == 2 || aliveNeighbours == 3) {
                  box[i].setBackground(BLACK);
                  newstates[i] = 1;
              } else {
                  box[i].setBackground(WHITE);
                  newstates[i] = 0;
              }
  
          } else if (state[i] == 0) {
              int aliveNeighbours = 0;
              if (state[i-(Gui.getDim()+1)] == 1) aliveNeighbours++;
              if (state[i-Gui.getDim()] == 1) aliveNeighbours++;
              if (state[i-(Gui.getDim()-1)] == 1) aliveNeighbours++;
              if (state[i-1] == 1) aliveNeighbours++;
              if (state[i+1] == 1) aliveNeighbours++;
              if (state[i+(Gui.getDim()-1)] == 1) aliveNeighbours++;
              if (state[i+Gui.getDim()] == 1) aliveNeighbours++;
              if (state[i+(Gui.getDim()+1)] == 1) aliveNeighbours++;
  
              if (aliveNeighbours == 3) {
                  box[i].setBackground(BLACK);
                  newstates[i] = 1;
              } else {
                  box[i].setBackground(WHITE);
                  newstates[i] = 0;
              }
          }
      }
      return newstates;
  }
  }
  </code></pre>