2016-04-30 18 views
0

我不知道如果我正在使用該方法repaint,我需要更新數字時鐘的時間,但即使有一個while循環試圖重繪,它doesn 「科技工作重繪方法不起作用或循環

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

爲什麼你需要一個'時,loop'不斷的打電話'repaint'? – MadProgrammer

回答

1

首先,調用重繪方法並不一定意味着UI將被再次繪製。無論用戶界面是否要再次繪製,它都由JVM控制。這基本上是JAVA中的一個內置功能。如果JVM檢測到UI已經改變,那麼只有JVM會再次繪製UI。這裏調用repaint方法只能觸發JVM來查看UI是否需要再次繪製。像最小化恢復和最大化框架將導致重繪被調用沒有任何代碼被使用。

這裏還要注意,你已經覆蓋了JFramepaint方法。你應該重寫paintComponent方法和應該在開始時

super.paintComponent(); 

這確保了JFrame的默認畫法完成,這樣,當你所畫不同的形狀進行更改,可以反映是一條線已經繪製JFrame

也用於顯示從main方法JFrame你應該使用:

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

爲了使框架可見。

1

你在做什麼根本上的錯誤在多個層面

它看起來像你試圖產生某種「時鐘」,我相信你想畫一個「段」時鐘,但我需要繼續挖掘。

  • 不要延伸JFrame,這是一個根本不好的起點,很多原因,你把自己鎖定在一個用例中,JFrame的有一個JRootPanecontentPane,它可以被繪沒有要求首先被繪的框架...
  • 不要覆蓋paint,一般來說,這樣做可能會導致無法結束問題並且通常不鼓勵,通常優選使用JPanelJComponent並且擴展覆蓋其paintComponent方法。油漆是複雜的,你要小心你做什麼,看看Painting in AWT and SwingPerforming Custom Painting更多細節
  • 你應該調用paint方法super方法,以確保您不會搞砸了噴漆工藝
  • A while-loop是嘗試更新UI的糟糕選擇,相反,我建議使用Swing Timer來代替,有關更多詳細信息,請參閱How to use Swing Timers。EDT99中的Timer報告使得在處理Swing時使用更安全,它還會在安排重新繪製時爲EDT和RepaintManager提供一些呼吸空間。
  • 重繪由RepaintManager控制,它可以將重複重繪請求合併爲更少數量的事件,這些事件開始表明問題的原因。

讓我們面對它,你只需要真正需要每秒更新一次,爲了安全起見,我可能每半秒更新一次,但那就是我。

對於example