2014-01-12 2 views
0

저는 현재 StandardPen 클래스를 사용하는 자바 시계에서 작업하고 있습니다. 프로그램을 실행하는 동안 내가 약 6-10 분에 도달 할 때를 제외하고는 모든 것이 올바르게 작동하는 것 같습니다. 시계가 고장났습니다. 나는 시침을 추가 한 직후 오류가있는 것으로 보인다. 시침이 초침과 분침과 다른 코드 인 이유는 thread.sleep (20)이 시침의 속도로 작업 할 수 없기 때문입니다. 누군가 제발 나를 빨리 도와주세요.왜 시계가 완벽하게 작동하지 않습니까?

import java.awt.Color; 
import TurtleGraphics.StandardPen; 

public class Clock_Final { 
    public static void main(String[] args) { 

     StandardPen pen = new StandardPen(); 

     double num=90, num1 = 90, num3 = 90, loop = 1, minute = 90, minuteclear = 90, cont = 0, cont2 = 0, tick1 = 90, hour = 90, hourclear = 90, hourcount = 0, hourcount1 = 0; 
     String three = "3", six = "6", nine = "9", twelve = "12", signature = "Created by: Me"; 

     pen.setColor(Color.black); 
     pen.up(); 
     pen.setDirection(270); 
     pen.move(350); 
     pen.setDirection(180); 
     pen.move(60); 
     pen.drawString(signature); 
     pen.down(); 
     pen.home(); 
//twelve 
     pen.setColor(Color.black); 
     pen.up(); 
     pen.setDirection(90); 
     pen.move(280); 
     pen.setDirection(180); 
     pen.move(7); 
     pen.down(); 
     pen.drawString(twelve); 
     pen.home(); 
//three 
     pen.up(); 
     pen.setDirection(0); 
     pen.move(278); 
     pen.setDirection(270); 
     pen.move(5); 
     pen.down(); 
     pen.drawString(three); 
     pen.home(); 

//six       
     pen.up(); 
     pen.setDirection(270); 
     pen.move(290); 
     pen.setDirection(180); 
     pen.move(3); 
     pen.down(); 
     pen.drawString(six); 
     pen.home(); 

//nine 
     pen.up(); 
     pen.setDirection(180); 
     pen.move(285); 
     pen.setDirection(270); 
     pen.move(5); 
     pen.down(); 
     pen.drawString(nine); 
     pen.home(); 
//_-_-_outside of the clock (the circle) 
     for (cont = 0; cont < 360; cont++) { 
      pen.setColor(Color.black); 
      pen.setDirection(num); 
      pen.setWidth(8); 
      pen.up(); 
      pen.move(270); 
      pen.down(); 
      pen.move(2); 
      pen.home(); 
      num--; 

      if (num==0) { 
       num = 360; 
      } 
     } 
    //tick start 
     for (cont2=0;cont2<60;cont2++) { 
      pen.setColor(Color.gray); 

      pen.setDirection(tick1); 
      pen.setWidth(3); 
      pen.up(); 
//method for minute/second ticks (start) 
      if (tick1 == 0 || tick1 == 30 || tick1 == 60 || tick1 == 90 || tick1 == 120 || tick1 == 150 || tick1 == 180 || tick1 == 210 || tick1 == 240 || tick1 == 270 || tick1 == 300 || tick1 == 330) { 
       if (tick1 == 0 || tick1 == 90 || tick1 == 180 || tick1 == 270) { 
        pen.setColor(Color.black); 
        pen.setWidth(5); 
        pen.move(225); 
        pen.down(); 
        pen.move(39); 
        pen.setColor(Color.gray); 
       } else { 
        pen.setColor(Color.darkGray); 
        pen.move(230); 
        pen.down(); 
        pen.move(34); 
        pen.setColor(Color.gray); 
       } 
      } //method for minute ticks (end) 
      else if (tick1 != 0 || tick1 != 30 || tick1 != 60 || tick1 != 90 || tick1 != 120 || tick1 != 150 || tick1 != 180 || tick1 != 210 || tick1 != 240 || tick1 != 270 || tick1 != 300 || tick1 != 330) { 
       pen.move(250); 
       pen.down(); 
       pen.move(14); 
      } 
      pen.home(); 
      if (tick1 == 0) { 
       tick1 = 360; 
      } 
      tick1 = tick1 - 6; 
     } 
     while (loop == 1) { 
     pen.setWidth(2); 
     //draw new second hand 
       pen.setColor(Color.red); 
       pen.setDirection(num1); 
       pen.move(220); 

       if (num1 < .05) { 
        num1 = 360; 
       } 
       num1 -= .3; 

     //draw new minute hand 
       pen.home(); 
       pen.setColor(Color.darkGray); 
       pen.setDirection(minute); 
       pen.move(200); 

       if (minute == 1) { 
        minute = 360; 
       } 
       minute -= .005; 

     //draw new hour hand 
       pen.home(); 
       pen.setColor(Color.darkGray); 
       pen.setDirection(hour); 
       pen.move(160); 

       if (hour == 0) { 
        hour = 360; 
       } 
       hourcount+=.05; 
       if (hourcount % 360 == 0) { 
        hour -= 1; 
       } 

       //sleep 
       try { 
        Thread.sleep(50); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 

    //clear old second hand 
       pen.home(); 
       pen.setColor(Color.white); 
       pen.setDirection(num3); 
       pen.move(220); 

       if (num3 < .05) { 
        num3 = 360; 
       } 
       num3 -= .3; 

       pen.home(); 

    //clear old minute hand 
       pen.home(); 
       pen.setColor(Color.white); 
       pen.setDirection(minuteclear); 
       pen.move(200); 

       if (minuteclear == 0) { 
        minuteclear = 360; 
       } 
       minuteclear -= .005; 

       pen.home(); 

    //clear old hour hand 
       pen.home(); 
       pen.setColor(Color.white); 
       pen.setDirection(hourclear); 
       pen.move(160); 

       if (hourclear == 0) { 
        hourclear = 360; 
       } 
       hourcount1+=.05; 
       if (hourcount1 % 360 == 0) { 
        hourclear -= 1; 
       } 

       pen.home(); 

     } 
    } 
} 

답변

0

나는 "글리치 아웃"을 의미한다고 생각하니, 시간 상실을 의미합니까? sleep()을 사용하여 시계를 운전할 때의 문제점은 실제로 얼마나 오래 잤는지 전혀 알지 못해서 시계를 그리는 데 시간이 걸린다는 것입니다. 작은 타이밍 오류는 시간이 지남에 따라 누적됩니다. 또한 멀티 태스킹 및 스레드 스케줄링은 실제로 얼마나 많은 시간이 경과했는지 결코 알 수 없다는 것을 의미합니다. 당신은 여전히 ​​당신의 시계를 그릴 시간을 결정하기 위해 sleep()을 사용할 수 있지만, 실제 시간을 "얻어야"하고 그것을 기반으로 시계를 그려야합니다. 참조 : 새 Date()와 GregorianCalendar를을 (를)

Calendar calendar = GregorianCalendar.getInstance(); 
calendar.setTime(new Date()); // current time 
int mins = calendar.get(Calendar.MINUTE); 
// etc.. 

내가이 방법을 사용하는 쓴 시계 렌더러입니다 ... 같은

https://code.google.com/p/catchpole/source/browse/trunk/catchpole-fuse/src/main/java/net/catchpole/awt/ClockFaceRenderer.java

+0

참고로, 성가신 오래된 날짜 - 시간의 수업을 ['java.util.Date'] (https://docs.oracle.com/javase/9/docs/api/java/util/Date.html), ['java.util.Calendar'] (https : /) /docs.oracle.com/javase/9/docs/api/java/util/Calendar.html) 및'java.text.SimpleDateFormat'은 이제 [legacy]입니다 (https://en.wikipedia.org/wiki/). Legacy_system), int가 내장 된 [java.time] (https://docs.oracle.com/javase/9/docs/api/java/time/package-summary.html) 클래스로 대체되었습니다. o Java 8 및 Java 9. [Tutorial by Oracle] (https://docs.oracle.com/javase/tutorial/datetime/TOC.html)을 참조하십시오. –

+0

음, 2014 년 1 월에이 답변을 올렸습니다. – slipperyseal

+0

내 의견은 비판이 아니며 오늘의 독자들에게만 남습니다. –

관련 문제