title: GUI not working after rewriting to MVC
body: <p>I'm practicing MVC style programming. I have a Mastermind game in a single file, working fine (maybe apart of the fact that "Check" button is invisible at start).</p>
  
  <p><a href="http://paste.pocoo.org/show/226726/" rel="noreferrer">http://paste.pocoo.org/show/226726/</a></p>
  
  <p>But when I've rewritten it to model, view, controller files - and when I click on empty Pin (that should be updated, and repainted with new color) - noting happens. Can anybody see any problems here ? I've tried placing repaint() in different places, but it simply does not work at all :/</p>
  
  <p>Main :  </p>
  
  <pre><code>public class Main { 
      public static void main(String[] args){
          Model model = new Model();
          View view = new View("Mastermind", 400, 590, model);
          Controller controller = new Controller(model, view); 
          view.setVisible(true);
      }
  }
  </code></pre>
  
  <p>Model :  </p>
  
  <pre><code>import java.util.Random;
  
  public class Model{
      static final int
      LINE = 5,
      SCORE = 10, OPTIONS = 20;
      Pin pins[][] = new Pin[21][LINE];
      int combination[] = new int[LINE];
      int curPin = 0;
      int turn = 1;
      Random generator = new Random();
      int repaintPin;
      boolean pinsRepaint=false;
      int pinsToRepaint;
      boolean isUpdate = true, isPlaying = true, isRowFull = false;
      static final int HIT_X[] = {270,290,310,290,310}, HIT_Y[] = {506,496,496,516,516};
  
      public Model(){
  
          for ( int i=0; i &lt; SCORE; i++ ){
              for ( int j = 0; j &lt; LINE; j++ ){
                  pins[i][j] = new Pin(20,0);
                  pins[i][j].setPosition(j*50+30,510-i*50);
                  pins[i+SCORE][j] = new Pin(8,0);
                  pins[i+SCORE][j].setPosition(HIT_X[j],HIT_Y[j]-i*50);
              }
          }
          for ( int i=0; i &lt; LINE; i++ ){
              pins[OPTIONS][i] = new Pin( 20, i+2 );
              pins[OPTIONS][i].setPosition( 370,i * 50 + 56);
          }
  
      }
  
      void fillHole(int color) {
          pins[turn-1][curPin].setColor(color+1);
          pinsRepaint = true;
          pinsToRepaint = turn;
          curPin = (curPin+1) % LINE;
          if (curPin == 0){
              isRowFull = true;
          }
          pinsRepaint = false;
          pinsToRepaint = 0;
      }
  
      void check() {
          int junkPins[] = new int[LINE], junkCode[] = new int[LINE];
          int pinCount = 0, pico = 0;
  
          for ( int i = 0; i &lt; LINE; i++ ) {
              junkPins[i] = pins[turn-1][i].getColor();
              junkCode[i] = combination[i];
          }
          for ( int i = 0; i &lt; LINE; i++ ){
              if (junkPins[i]==junkCode[i]) {
                  pins[turn+SCORE][pinCount].setColor(1);
                  pinCount++;
                  pico++;
                  junkPins[i] = 98;
                  junkCode[i] = 99;
              }
          }
          for ( int i = 0; i &lt; LINE; i++ ){
              for ( int j = 0; j &lt; LINE; j++ )
                  if (junkPins[i]==junkCode[j]) {
                      pins[turn+SCORE][pinCount].setColor(2);
                      pinCount++;
                      junkPins[i] = 98;
                      junkCode[j] = 99;
                      j = LINE;
              }
          }
          pinsRepaint = true;
          pinsToRepaint = turn + SCORE;
          pinsRepaint = false;
          pinsToRepaint=0;
  
          if ( pico == LINE ){
              isPlaying = false;
          }
          else if ( turn &gt;= 10 ){
                  isPlaying = false;
          }
          else{
              curPin = 0;
              isRowFull = false;
              turn++;
          }
      }
  
      void combination() {
          for ( int i = 0; i &lt; LINE; i++ ){
            combination[i] = generator.nextInt(6) + 1;
          }
      }
  }
  
  class Pin{
      private int color, X, Y, radius;
  
      public Pin(){
          X = 0; Y = 0; radius = 0; color = 0;
      }
  
      public Pin( int r,int c ){
          X = 0; Y = 0; radius = r; color = c;
      }
  
      public int getX(){
          return X;
      }
  
      public int getY(){
          return Y;
      }
  
      public int getRadius(){
          return radius;
      }
  
      public void setRadius(int r){
          radius = r;
      }
  
      public void setPosition( int x,int y ){
          this.X = x ;
          this.Y = y ;
      }
      public void setColor( int c ){
          color = c;
      }
      public int getColor() {
          return color;
      }
  }
  </code></pre>
  
  <p>View:  </p>
  
  <pre><code>import java.awt.*;
  import javax.swing.*;
  
  public class View extends Frame{  
      Model model;
      JButton checkAnswer;
      private JPanel button;
      private static final Color COLORS[] = {Color.black, Color.white, Color.red, Color.yellow, Color.green, Color.blue, new Color(7, 254, 250)};
  
      public View(String name, int w, int h, Model m){
          model = m;
          setTitle( name );
          setSize( w,h );
          setResizable( false );
          this.setLayout(new BorderLayout());
  
          button = new JPanel();
          button.setSize( new Dimension(400, 100));
          button.setVisible(true);
          checkAnswer = new JButton("Check");
          checkAnswer.setSize( new Dimension(200, 30));
          button.add( checkAnswer );
          this.add( button, BorderLayout.SOUTH);
          button.setVisible(true);
      }
  
      @Override
      public void paint( Graphics g ) {
          g.setColor( new Color(238, 238, 238));
          g.fillRect( 0,0,400,590);
  
          for ( int i=0; i &lt; model.pins.length; i++ ) {
              paintPins(model.pins[i][0],g);
              paintPins(model.pins[i][1],g);
              paintPins(model.pins[i][2],g);
              paintPins(model.pins[i][3],g);
              paintPins(model.pins[i][4],g);
          }
      }
  
      @Override
      public void update( Graphics g ) {
          if ( model.isUpdate ) {
              paint(g);
          }
          else {
              model.isUpdate = true;
              paintPins(model.pins[model.repaintPin-1][0],g);
              paintPins(model.pins[model.repaintPin-1][1],g);
              paintPins(model.pins[model.repaintPin-1][2],g);
              paintPins(model.pins[model.repaintPin-1][3],g);
              paintPins(model.pins[model.repaintPin-1][4],g);
          }
      }
  
      void repaintPins( int pin ) {
          model.repaintPin = pin;
          model.isUpdate = false;
          repaint();
      }
  
      public void paintPins(Pin p, Graphics g ){
          int X = p.getX();
          int Y = p.getY();
          int color = p.getColor();
          int radius = p.getRadius();
          int x = X-radius;
          int y = Y-radius;
  
          if (color &gt; 0){
              g.setColor( COLORS[color]);
              g.fillOval( x,y,2*radius,2*radius );
          }
          else{
              g.setColor( new Color(238, 238, 238) );
              g.drawOval( x,y,2*radius-1,2*radius-1 );
          }
          g.setColor( Color.black );
          g.drawOval( x,y,2*radius,2*radius );
      }
  }
  </code></pre>
  
  <p>Controller:</p>
  
  <pre><code>import java.awt.*;
  import java.awt.event.*;
  
  public class Controller implements MouseListener, ActionListener { 
      private Model model;
      private View view;
  
      public Controller(Model m, View v){ 
          model = m;
          view = v;
  
          view.addWindowListener( new WindowAdapter(){
              public void windowClosing(WindowEvent e){
              System.exit(0);
          } });
          view.addMouseListener(this);
          view.checkAnswer.addActionListener(this);
          model.combination();
      }
  
      public void actionPerformed( ActionEvent e ) {
          if(e.getSource() == view.checkAnswer){
              if(model.isRowFull){
                  model.check();
              }
          }
      }
  
      public void mousePressed(MouseEvent e) {
          Point mouse = new Point();
  
          mouse = e.getPoint();
          if (model.isPlaying){
              if (mouse.x &gt; 350) {
                  int button = 1 + (int)((mouse.y - 32) / 50);
                  if ((button &gt;= 1) &amp;&amp; (button &lt;= 5)){
                      model.fillHole(button);
                      if(model.pinsRepaint){
                          view.repaintPins( model.pinsToRepaint );
                      }
                  }
              }
          }
      }
  
      public void mouseClicked(MouseEvent e) {}
      public void mouseReleased(MouseEvent e){}
      public void mouseEntered(MouseEvent e) {}
      public void mouseExited(MouseEvent e)  {}
  }
  </code></pre>