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

进程与线程

开发平台:

Java

  1. import java.awt.*;
  2. import java.text.*;
  3. import java.lang.reflect.*;
  4. import javax.swing.*;
  5. public class DigitalTimer extends JLabel {
  6. private volatile String timeText;
  7. private Thread internalThread;
  8. private volatile boolean noStopRequested;
  9. public DigitalTimer() {
  10. setBorder(BorderFactory.createLineBorder(Color.black));
  11. setHorizontalAlignment(SwingConstants.RIGHT);
  12. setFont(new Font("SansSerif", Font.BOLD, 16));
  13. setText("00000.0"); // use to size component
  14. setMinimumSize(getPreferredSize());
  15. setPreferredSize(getPreferredSize());
  16. setSize(getPreferredSize());
  17. timeText = "0.0";
  18. setText(timeText);
  19. noStopRequested = true;
  20. Runnable r = new Runnable() {
  21. public void run() {
  22. try {
  23. runWork();
  24. } catch ( Exception x ) {
  25. x.printStackTrace(); 
  26. }
  27. }
  28. };
  29. internalThread = new Thread(r, "DigitalTimer");
  30. internalThread.start();
  31. }
  32. private void runWork() {
  33. long startTime = System.currentTimeMillis();
  34. int tenths = 0;
  35. long normalSleepTime = 100;
  36. long nextSleepTime = 100;
  37. DecimalFormat fmt = new DecimalFormat("0.0");
  38. Runnable updateText = new Runnable() {
  39. public void run() {
  40. setText(timeText);
  41. }
  42. };
  43. while ( noStopRequested ) {
  44. try {
  45. Thread.sleep(nextSleepTime);
  46. tenths++;
  47. long currTime = System.currentTimeMillis();
  48. long elapsedTime = currTime - startTime;
  49. nextSleepTime = normalSleepTime + 
  50. ( ( tenths * 100 ) - elapsedTime );
  51. if ( nextSleepTime < 0 ) {
  52. nextSleepTime = 0;
  53. }
  54. timeText = fmt.format(elapsedTime / 1000.0);
  55. SwingUtilities.invokeAndWait(updateText);
  56. } catch ( InterruptedException ix ) {
  57. // stop running
  58. return;
  59. } catch ( InvocationTargetException x ) {
  60. // If an exception was thrown inside the
  61. // run() method of the updateText Runnable.
  62. x.printStackTrace();
  63. }
  64. }
  65. }
  66. public void stopRequest() {
  67. noStopRequested = false;
  68. internalThread.interrupt();
  69. }
  70. public boolean isAlive() {
  71. return internalThread.isAlive();
  72. }
  73. public static void main(String[] args) {
  74. DigitalTimer dt = new DigitalTimer();
  75. JPanel p = new JPanel(new FlowLayout());
  76. p.add(dt);
  77. JFrame f = new JFrame("DigitalTimer Demo");
  78. f.setContentPane(p);
  79. f.setSize(250, 100);
  80. f.setVisible(true);
  81. }
  82. }