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

进程与线程

开发平台:

Java

  1. import java.awt.*;
  2. import java.awt.image.*;
  3. import java.awt.font.*;
  4. import java.awt.geom.*;
  5. import javax.swing.*;
  6. public class ScrollText extends JComponent {
  7. private BufferedImage image;
  8. private Dimension imageSize;
  9. private volatile int currOffset;
  10. private Thread internalThread;
  11. private volatile boolean noStopRequested;
  12. public ScrollText(String text) {
  13. currOffset = 0;
  14. buildImage(text);
  15. setMinimumSize(imageSize);
  16. setPreferredSize(imageSize);
  17. setMaximumSize(imageSize);
  18. setSize(imageSize);
  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, "ScrollText");
  30. internalThread.start();
  31. }
  32. private void buildImage(String text) {
  33. // Request that the drawing be done with anti-aliasing
  34. // turned on and the quality high.
  35. RenderingHints renderHints = new RenderingHints(
  36. RenderingHints.KEY_ANTIALIASING,
  37. RenderingHints.VALUE_ANTIALIAS_ON);
  38. renderHints.put(
  39. RenderingHints.KEY_RENDERING,
  40. RenderingHints.VALUE_RENDER_QUALITY);
  41. // Create a scratch image for use in determining
  42. // the text dimensions.
  43. BufferedImage scratchImage = new BufferedImage(
  44. 1, 1, BufferedImage.TYPE_INT_RGB);
  45. Graphics2D scratchG2 = scratchImage.createGraphics();
  46. scratchG2.setRenderingHints(renderHints);
  47. Font font = 
  48. new Font("Serif", Font.BOLD | Font.ITALIC, 24);
  49. FontRenderContext frc = scratchG2.getFontRenderContext();
  50. TextLayout tl = new TextLayout(text, font, frc);
  51. Rectangle2D textBounds = tl.getBounds();
  52. int textWidth = (int) Math.ceil(textBounds.getWidth());
  53. int textHeight = (int) Math.ceil(textBounds.getHeight());
  54. int horizontalPad = 10;
  55. int verticalPad = 6;
  56. imageSize = new Dimension(
  57. textWidth + horizontalPad,
  58. textHeight + verticalPad
  59. );
  60. // Create the properly-sized image
  61. image = new BufferedImage(
  62. imageSize.width,
  63. imageSize.height,
  64. BufferedImage.TYPE_INT_RGB);
  65. Graphics2D g2 = image.createGraphics();
  66. g2.setRenderingHints(renderHints);
  67. int baselineOffset = 
  68. ( verticalPad / 2 ) - ( (int) textBounds.getY());
  69. g2.setColor(Color.white);
  70. g2.fillRect(0, 0, imageSize.width, imageSize.height);
  71. g2.setColor(Color.blue);
  72. tl.draw(g2, 0, baselineOffset);
  73. // Free-up resources right away, but keep "image" for
  74. // animation.
  75. scratchG2.dispose();
  76. scratchImage.flush();
  77. g2.dispose();
  78. }
  79. public void paint(Graphics g) {
  80. // Make sure to clip the edges, regardless of curr size
  81. g.setClip(0, 0, imageSize.width, imageSize.height);
  82. int localOffset = currOffset; // in case it changes
  83. g.drawImage(image, -localOffset, 0, this);
  84. g.drawImage(
  85. image, imageSize.width - localOffset, 0, this);
  86. // draw outline
  87. g.setColor(Color.black);
  88. g.drawRect(
  89. 0, 0, imageSize.width - 1, imageSize.height - 1);
  90. }
  91. private void runWork() {
  92. while ( noStopRequested ) {
  93. try {
  94. Thread.sleep(100);  // 10 frames per second
  95. // adjust the scroll position
  96. currOffset = 
  97. ( currOffset + 1 ) % imageSize.width;
  98. // signal the event thread to call paint()
  99. repaint();
  100. } catch ( InterruptedException x ) {
  101. Thread.currentThread().interrupt(); 
  102. }
  103. }
  104. }
  105. public void stopRequest() {
  106. noStopRequested = false;
  107. internalThread.interrupt();
  108. }
  109. public boolean isAlive() {
  110. return internalThread.isAlive();
  111. }
  112. public static void main(String[] args) {
  113. ScrollText st = 
  114. new ScrollText("Java can do animation!");
  115. JPanel p = new JPanel(new FlowLayout());
  116. p.add(st);
  117. JFrame f = new JFrame("ScrollText Demo");
  118. f.setContentPane(p);
  119. f.setSize(400, 100);
  120. f.setVisible(true);
  121. }
  122. }