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

进程与线程

开发平台:

Java

  1. import java.awt.*;
  2. import java.awt.image.*;
  3. import java.awt.geom.*;
  4. import javax.swing.*;
  5. public class Squish extends JComponent {
  6. private Image[] frameList;
  7. private long msPerFrame;
  8. private volatile int currFrame;
  9. private Thread internalThread;
  10. private volatile boolean noStopRequested;
  11. public Squish(
  12. int width,
  13. int height,
  14. long msPerCycle, 
  15. int framesPerSec, 
  16. Color fgColor
  17. ) {
  18. setPreferredSize(new Dimension(width, height));
  19. int framesPerCycle = 
  20. (int) ( ( framesPerSec * msPerCycle ) / 1000 );
  21. msPerFrame = 1000L / framesPerSec;
  22. frameList = 
  23. buildImages(width, height, fgColor, framesPerCycle);
  24. currFrame = 0;
  25. noStopRequested = true;
  26. Runnable r = new Runnable() {
  27. public void run() {
  28. try {
  29. runWork();
  30. } catch ( Exception x ) {
  31. // in case ANY exception slips through
  32. x.printStackTrace(); 
  33. }
  34. }
  35. };
  36. internalThread = new Thread(r);
  37. internalThread.start();
  38. }
  39. private Image[] buildImages(
  40. int width, 
  41. int height, 
  42. Color color,
  43. int count
  44. ) {
  45. BufferedImage[] im = new BufferedImage[count];
  46. for ( int i = 0; i < count; i++ ) {
  47. im[i] = new BufferedImage(
  48. width, height, BufferedImage.TYPE_INT_ARGB);
  49. double xShape = 0.0;
  50. double yShape = 
  51. ( (double) ( i * height ) ) / (double) count;
  52. double wShape = width;
  53. double hShape = 2.0 * ( height - yShape );
  54. Ellipse2D shape = new Ellipse2D.Double(
  55. xShape, yShape, wShape, hShape);
  56. Graphics2D g2 = im[i].createGraphics();
  57. g2.setColor(color);
  58. g2.fill(shape);
  59. g2.dispose();
  60. }
  61. return im;
  62. }
  63. private void runWork() {
  64. while ( noStopRequested ) {
  65. currFrame = ( currFrame + 1 ) % frameList.length;
  66. repaint();
  67. try {
  68. Thread.sleep(msPerFrame);
  69. } catch ( InterruptedException x ) {
  70. // reassert interrupt
  71. Thread.currentThread().interrupt(); 
  72. // continue on as if sleep completed normally
  73. }
  74. }
  75. }
  76. public void stopRequest() {
  77. noStopRequested = false;
  78. internalThread.interrupt();
  79. }
  80. public boolean isAlive() {
  81. return internalThread.isAlive();
  82. }
  83. public void paint(Graphics g) {
  84. g.drawImage(frameList[currFrame], 0, 0, this);
  85. }
  86. }