SecondCounter.java
上传用户:songled
上传日期:2022-07-14
资源大小:94k
文件大小:2k
源码类别:

进程与线程

开发平台:

Java

  1. import java.awt.*;
  2. import javax.swing.*;
  3. import java.text.*;
  4. public class SecondCounter extends JComponent implements Runnable {
  5. private volatile boolean keepRunning;
  6. private Font paintFont;
  7. private volatile String timeMsg;
  8. private volatile int arcLen;
  9. public SecondCounter() {
  10. paintFont = new Font("SansSerif", Font.BOLD, 14);
  11. timeMsg = "never started";
  12. arcLen = 0;
  13. }
  14. public void run() {
  15. runClock();
  16. }
  17. public void runClock() {
  18. DecimalFormat fmt = new DecimalFormat("0.000");
  19. long normalSleepTime = 100;
  20. long nextSleepTime = normalSleepTime;
  21. int counter = 0;
  22. long startTime = System.currentTimeMillis();
  23. keepRunning = true;
  24. while ( keepRunning ) {
  25. try {
  26. Thread.sleep(nextSleepTime);
  27. } catch ( InterruptedException x ) {
  28. // ignore
  29. }
  30. counter++;
  31. double counterSecs = counter / 10.0;
  32. double elapsedSecs = 
  33. ( System.currentTimeMillis() - startTime ) / 1000.0;
  34. double diffSecs = counterSecs - elapsedSecs;
  35. nextSleepTime = normalSleepTime + 
  36. ( ( long ) ( diffSecs * 1000.0 ) );
  37. if ( nextSleepTime < 0 ) {
  38. nextSleepTime = 0;
  39. }
  40. timeMsg = fmt.format(counterSecs) + " - " + 
  41. fmt.format(elapsedSecs) + " = " +
  42. fmt.format(diffSecs);
  43. arcLen = ( ( ( int ) counterSecs ) % 60 ) * 360 / 60;
  44. repaint();
  45. }
  46. }
  47. public void stopClock() {
  48. keepRunning = false;
  49. }
  50. public void paint(Graphics g) {
  51. g.setColor(Color.black);
  52. g.setFont(paintFont);
  53. g.drawString(timeMsg, 0, 15);
  54. g.fillOval(0, 20, 100, 100);  // black border
  55. g.setColor(Color.white);
  56. g.fillOval(3, 23, 94, 94);  // white for unused portion
  57. g.setColor(Color.blue);  // blue for used portion
  58. g.fillArc(2, 22, 96, 96, 90, -arcLen);
  59. }
  60. }