2016-04-30 11 views
0

私は、メソッドの再描画を使用しているかどうかわかりません、私はデジタル時計の時刻を更新する必要がありますが、 「TはRepaintメソッドが動作しない、またはループしない

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(); 
     } 
    } 

} 

を働く私は私のコードを改善したが、先生は私がこのコードのためのタイマーを使いたくなかったので、私は、スレッドを使用して、再描画を毎秒を遅らせる必要があり、私はこれを試してみましたが、それまだ更新されません

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(); 
} 

}

+0

についてあなたが求める方法はpaintComponent' –

+0

は、なぜあなたは 'repaint'を呼び出す保つために'ながら-loop'が必要なのか 'のですか? – MadProgrammer

答えて

1

まず最初に、repaintメソッドを呼び出すことは、必ずしもUIが再びペイントされることを意味するわけではありません。 UIが再描画されるかどうかは、JVMによって制御されます。これは基本的にJAVAの組み込み機能です。 UIが変更されたことをJVMが検出すると、JVMのみが再びUIをペイントします。ここでrepaintメソッドを呼び出すと、JVMがUIを再描画する必要があるかどうかを確認するだけです。フレームの復元と最大化を最小限に抑えると、コードを使用せずに呼び出されるようになります。

JFramepaintメソッドをオーバーライドしたことにも注意してください。あなたはpaintComponentメソッドをオーバーライドする必要があります。これは、あなたが異なる形状をペイントすることにより変更を加える際に、それが反映させることができるようにJFrameのデフォルトの塗装方法が完全であることを保証初め

super.paintComponent(); 

で行があるはずです既に描かれたJFrame。フレームを見えるようにするために

Frame f = new Frame(); 
f.setVisible(true); 

:あなたが使用する必要がありますあなたのmain方法からJFrameを示すためにも

。あなたはいくつかの種類の「時計」を生成しようとしているように見えます

レベルの数には根本的に間違って何をやっている

1

は、私はあなたが「セグメント」時計をペイントしようとしていると推定しますしかし、私は掘り続ける必要があるでしょう。

  • JFrameを拡張しないでください。これは根本的に悪いところです。これには多くの理由があります。あなたがそうすること、一般的に、paintを上書きしないでください
  • ... JFrame年代が最初にペイントされるフレームを必要とせずに塗装することができJRootPanecontentPaneを持っている、単一のユースケースに自分自身をロックすることのない終わりを引き起こすことはできません通常はお勧めしませんが、JPanelまたはJComponentを使用し、そのpaintComponentメソッドをオーバーライドすることをお勧めします。ペイントは複雑であり、あなたは何をすべきか注意する必要があり、あなたは塗装工程
  • を台無しにしないようにpaint方法superメソッドを呼び出すべきである詳細
  • ためPainting in AWT and SwingPerforming Custom Paintingを見てA while-loopはUIを更新しようとしてはうまくいかず、代わりにSwing Timerを使用することをお勧めします。詳しくはHow to use Swing Timersをご覧ください。Timerは、EDT内のティックを報告し、Swingを扱う際に使用するのがより安全になります。また、EDTとRepaintManagerの再呼スケジュールを行うときに呼吸の余地があります。
  • 再ペイントはRepaintManagerによって制御されます。繰り返し再ペイントリクエストを少数のイベントに統合すると問題の原因を示唆し始めます。

あなたは実際には1秒に1回しか更新する必要はありませんが、安全な側になるようにするために、半分ごとに更新するかもしれませんが、それは私です。

example