title: Repaint method doesn't work or loop
body: <p><strong>I don't know if I'm using the method repaint corretly, i need to update the time of a digital clock, but even with a while loop trying to repaint, it doesn't work</strong></p>
  
  <pre><code>public class Frame extends JFrame{
  
  
      Calendar calendar = Calendar.getInstance();
      int[] horaD = new int[14];
      int[] horaU = new int[14];
      int[] minD = new int[14];
      int[] minU = new int[14];
      int[] segD = new int[14];
      int[] segU = new int[14];
  
      public Frame(){
          this.setTitle("Relógio Digital");
          this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          this.pack();
          this.setSize(1000, 400);
          this.setVisible(true); 
      }
  
      public void obterHora(){
          verificaHora();
          verificaMinuto();
          verificaSegundo();
      }
  
      public void verificaHora(){
  
          int d;
          int u;
          int i = calendar.get(Calendar.HOUR_OF_DAY);
          char[] digitos = String.valueOf(i).toCharArray();
          if(digitos.length == 2){
              d = Integer.parseInt(String.valueOf(digitos[0]));
              u = Integer.parseInt(String.valueOf(digitos[1]));
          }else{
              d = 0;
              u = Integer.parseInt(String.valueOf(digitos[0]));
          }
  
          switch(d){
              case 0:
                  horaD = Numeros.Zero;
                  break;
              case 1:
                  horaD = Numeros.Um;
                  break;
              case 2:
                  horaD = Numeros.Dois;
                  break;
              default:
                  horaU = Numeros.Zero;
                  break;
          }
  
          switch(u){
              case 0:
                  horaU = Numeros.Zero;
                  break;
              case 1:
                  horaU = Numeros.Um;
                  break;
              case 2:
                  horaU = Numeros.Dois;
                  break;
              case 3:
                  horaU = Numeros.Tres;
                  break;
              case 4:
                  horaU = Numeros.Quatro;
                  break;
              case 5:
                  horaU = Numeros.Cinco;
                  break;
              case 6:
                  horaU = Numeros.Seis;
                  break;
              case 7:
                  horaU = Numeros.Sete;
                  break;
              case 8:
                  horaU = Numeros.Oito;
                  break;
              case 9:
                  horaU = Numeros.Nove;
                  break;
              default:
                  horaU = Numeros.Zero;
                  break;
          }   
      }   
      public void verificaMinuto(){
  
          int d;
          int u;
          int i = calendar.get(Calendar.MINUTE);
          char[] digitos = String.valueOf(i).toCharArray();
          if(digitos.length == 2){
              d = Integer.parseInt(String.valueOf(digitos[0]));
              u = Integer.parseInt(String.valueOf(digitos[1]));
          }else{
              d = 0;
              u = Integer.parseInt(String.valueOf(digitos[0]));
          }
          switch(d){
              case 0:
                  minD = Numeros.Zero;
                  break;
              case 1:
                  minD = Numeros.Um;
                  break;
              case 2:
                  minD = Numeros.Dois;
                  break;
              case 3:
                  minD = Numeros.Tres;
                  break;
              case 4:
                  minD = Numeros.Quatro;
                  break;
              case 5:
                  minD = Numeros.Cinco;
                  break;
              default:
                  minD = Numeros.Zero;
                  break;
          }
  
          switch(u){
              case 0:
                  minU = Numeros.Zero;
                  break;
              case 1:
                  minU = Numeros.Um;
                  break;
              case 2:
                  minU = Numeros.Dois;
                  break;
              case 3:
                  minU = Numeros.Tres;
                  break;
              case 4:
                  minU = Numeros.Quatro;
                  break;
              case 5:
                  minU = Numeros.Cinco;
                  break;
              case 6:
                  minU = Numeros.Seis;
                  break;
              case 7:
                  minU = Numeros.Sete;
                  break;
              case 8:
                  minU = Numeros.Oito;
                  break;
              case 9:
                  minU = Numeros.Nove;
                  break;
              default:
                  minU = Numeros.Zero;
                  break;
          }   
      }
      public void verificaSegundo(){
  
          int d;
          int u;
          int i = calendar.get(Calendar.SECOND);
          char[] digitos = String.valueOf(i).toCharArray();
          if(digitos.length == 2){
              d = Integer.parseInt(String.valueOf(digitos[0]));
              u = Integer.parseInt(String.valueOf(digitos[1]));
          }else{
              d = 0;
              u = Integer.parseInt(String.valueOf(digitos[0]));
          }
  
          switch(d){
              case 0:
                  segD = Numeros.Zero;
                  break;
              case 1:
                  segD = Numeros.Um;
                  break;
              case 2:
                  segD = Numeros.Dois;
                  break;
              case 3:
                  segD = Numeros.Tres;
                  break;
              case 4:
                  segD = Numeros.Quatro;
                  break;
              case 5:
                  segD = Numeros.Cinco;
                  break;
              default:
                  segD = Numeros.Zero;
                  break;
          }
  
          switch(u){
              case 0:
                  segU = Numeros.Zero;
                  break;
              case 1:
                  segU = Numeros.Um;
                  break;
              case 2:
                  segU = Numeros.Dois;
                  break;
              case 3:
                  segU = Numeros.Tres;
                  break;
              case 4:
                  segU = Numeros.Quatro;
                  break;
              case 5:
                  segU = Numeros.Cinco;
                  break;
              case 6:
                  segU = Numeros.Seis;
                  break;
              case 7:
                  segU = Numeros.Sete;
                  break;
              case 8:
                  segU = Numeros.Oito;
                  break;
              case 9:
                  segU = Numeros.Nove;
                  break;
              default:
                  segU = Numeros.Zero;
                  break;
          }   
      }
  
      @Override
      public void paint(Graphics g){
  
          g.setColor(Color.black);
  
          obterHora();
  
          //Dígito da dezena da hora
          g.fillRect(100, 100, horaD[0], horaD[7]);
          g.fillRect(100, 100, horaD[1], horaD[8]);
          g.fillRect(200, 100, horaD[2], horaD[9]);
          g.fillRect(100, 200, horaD[3], horaD[10]);
          g.fillRect(200, 200, horaD[4], horaD[11]);
          g.fillRect(100, 200, horaD[5], horaD[12]);
          g.fillRect(100, 300, horaD[6], horaD[13]);
  
          //Dígito da unidade da hora
          g.fillRect(230, 100, horaU[0], horaU[7]);
          g.fillRect(230, 100, horaU[1], horaU[8]);
          g.fillRect(330, 100, horaU[2], horaU[9]);
          g.fillRect(230, 200, horaU[3], horaU[10]);
          g.fillRect(330, 200, horaU[4], horaU[11]);
          g.fillRect(230, 200, horaU[5], horaU[12]);
          g.fillRect(230, 300, horaU[6], horaU[13]);
  
          //Dois pontos (Hora/Minuto)
          g.fillRect(365, 180, 15, 15);
          g.fillRect(365, 215, 15, 15);
  
          //Dígito da dezena do minuto
          g.fillRect(400, 100, minD[0], minD[7]);
          g.fillRect(400, 100, minD[1], minD[8]);
          g.fillRect(500, 100, minD[2], minD[9]);
          g.fillRect(400, 200, minD[3], minD[10]);
          g.fillRect(500, 200, minD[4], minD[11]);
          g.fillRect(400, 200, minD[5], minD[12]);
          g.fillRect(400, 300, minD[6], minD[13]);
  
          //Dígito da unidade do minuto
          g.fillRect(530, 100, minU[0], minU[7]);
          g.fillRect(530, 100, minU[1], minU[8]);
          g.fillRect(630, 100, minU[2], minU[9]);
          g.fillRect(530, 200, minU[3], minU[10]);
          g.fillRect(630, 200, minU[4], minU[11]);
          g.fillRect(530, 200, minU[5], minU[12]);
          g.fillRect(530, 300, minU[6], minU[13]);
  
          //Dois pontos (Minuto/Segundo)
          g.fillRect(665, 180, 15, 15);
          g.fillRect(665, 215, 15, 15);
  
          //Dígito da dezena do segundo
          g.fillRect(700, 100, segD[0], segD[7]);
          g.fillRect(700, 100, segD[1], segD[8]);
          g.fillRect(800, 100, segD[2], segD[9]);
          g.fillRect(700, 200, segD[3], segD[10]);
          g.fillRect(800, 200, segD[4], segD[11]);
          g.fillRect(700, 200, segD[5], segD[12]);
          g.fillRect(700, 300, segD[6], segD[13]);
  
          //Dígito da unidade do segundo
          g.fillRect(830, 100, segU[0], segU[7]);
          g.fillRect(830, 100, segU[1], segU[8]);
          g.fillRect(930, 100, segU[2], segU[9]);
          g.fillRect(830, 200, segU[3], segU[10]);
          g.fillRect(930, 200, segU[4], segU[11]);
          g.fillRect(830, 200, segU[5], segU[12]);
          g.fillRect(830, 300, segU[6], segU[13]);
      }
  
      public static void main(String[] args) {
          // TODO Auto-generated method stub
          Frame f = new Frame();
          while(true){
              f.repaint();
          }
      }
  
  }
  </code></pre>
  
  <p><strong>I improved my code, but I have to delay the repaint every second using a Thread, because my teacher didn't want me to use Timer for this code, I tried this but it still doesn't update</strong></p>
  
  <pre><code>public class Frame extends JFrame{
  HoraExata he = new HoraExata(); //Exact Time
  
  private int[] horaD = new int[14];
  private int[] horaU = new int[14];
  private int[] minD = new int[14];
  private int[] minU = new int[14];
  private int[] segD = new int[14];
  private int[] segU = new int[14];
  
  public Frame(){
      this.setTitle("Relógio Digital");
      this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      this.pack();
      this.setSize(1000, 400);
  }
  
   public void atualizaHora() { //Update Time
       while (true) {
               repaint();
               try {
                       Thread.sleep(1000);
               } catch (InterruptedException e) {
               }
       }
   }
  
  public void obterHora(){ //Get the values to make each number in canvas
      horaD = he.verificaHora(1);
      horaU = he.verificaHora(2);
      minD = he.verificaMinuto(1);
      minU = he.verificaMinuto(2);
      segD = he.verificaSegundo(1);
      segU = he.verificaSegundo(2);
  }
  
  public void paint(Graphics g){
  
      g.setColor(Color.black);
  
      obterHora();
  
      //Dígito da dezena da hora
      g.fillRect(100, 100, horaD[0], horaD[7]);
      g.fillRect(100, 100, horaD[1], horaD[8]);
      g.fillRect(200, 100, horaD[2], horaD[9]);
      g.fillRect(100, 200, horaD[3], horaD[10]);
      g.fillRect(200, 200, horaD[4], horaD[11]);
      g.fillRect(100, 200, horaD[5], horaD[12]);
      g.fillRect(100, 300, horaD[6], horaD[13]);
  
      //Dígito da unidade da hora
      g.fillRect(230, 100, horaU[0], horaU[7]);
      g.fillRect(230, 100, horaU[1], horaU[8]);
      g.fillRect(330, 100, horaU[2], horaU[9]);
      g.fillRect(230, 200, horaU[3], horaU[10]);
      g.fillRect(330, 200, horaU[4], horaU[11]);
      g.fillRect(230, 200, horaU[5], horaU[12]);
      g.fillRect(230, 300, horaU[6], horaU[13]);
  
      //Dois pontos (Hora/Minuto)
      g.fillRect(365, 180, 15, 15);
      g.fillRect(365, 215, 15, 15);
  
      //Dígito da dezena do minuto
      g.fillRect(400, 100, minD[0], minD[7]);
      g.fillRect(400, 100, minD[1], minD[8]);
      g.fillRect(500, 100, minD[2], minD[9]);
      g.fillRect(400, 200, minD[3], minD[10]);
      g.fillRect(500, 200, minD[4], minD[11]);
      g.fillRect(400, 200, minD[5], minD[12]);
      g.fillRect(400, 300, minD[6], minD[13]);
  
      //Dígito da unidade do minuto
      g.fillRect(530, 100, minU[0], minU[7]);
      g.fillRect(530, 100, minU[1], minU[8]);
      g.fillRect(630, 100, minU[2], minU[9]);
      g.fillRect(530, 200, minU[3], minU[10]);
      g.fillRect(630, 200, minU[4], minU[11]);
      g.fillRect(530, 200, minU[5], minU[12]);
      g.fillRect(530, 300, minU[6], minU[13]);
  
      //Dois pontos (Minuto/Segundo)
      g.fillRect(665, 180, 15, 15);
      g.fillRect(665, 215, 15, 15);
  
      //Dígito da dezena do segundo
      g.fillRect(700, 100, segD[0], segD[7]);
      g.fillRect(700, 100, segD[1], segD[8]);
      g.fillRect(800, 100, segD[2], segD[9]);
      g.fillRect(700, 200, segD[3], segD[10]);
      g.fillRect(800, 200, segD[4], segD[11]);
      g.fillRect(700, 200, segD[5], segD[12]);
      g.fillRect(700, 300, segD[6], segD[13]);
  
      //Dígito da unidade do segundo
      g.fillRect(830, 100, segU[0], segU[7]);
      g.fillRect(830, 100, segU[1], segU[8]);
      g.fillRect(930, 100, segU[2], segU[9]);
      g.fillRect(830, 200, segU[3], segU[10]);
      g.fillRect(930, 200, segU[4], segU[11]);
      g.fillRect(830, 200, segU[5], segU[12]);
      g.fillRect(830, 300, segU[6], segU[13]);
  }
  
  public static void main(String[] args) {
      // TODO Auto-generated method stub
      Frame f = new Frame();
      f.setVisible(true);
      f.atualizaHora();
  }
  </code></pre>
  
  <p>}</p>