/** * File: Ticker.java * Author: Brian Borowski * Date created: May 1999 * Date last modified: August 22, 2007 */ import java.awt.Color; import java.awt.Font; import java.awt.FontMetrics; import java.awt.Graphics; import javax.swing.JComponent; public class Ticker extends JComponent implements Runnable { private int xPos, strWidth, fontHeight, fontDescent; private Thread runner; private String text; private Color textColor, backColor; private Font font = new Font("SansSerif", Font.PLAIN, 24); public Ticker(String text, Color textColor, Color backColor) { this.text = text; this.textColor = textColor; this.backColor = backColor; FontMetrics fontMetrics = getFontMetrics(font); fontHeight = fontMetrics.getHeight(); fontDescent = fontMetrics.getDescent(); strWidth = fontMetrics.stringWidth(text); xPos = Integer.MAX_VALUE; setDoubleBuffered(true); } public void setTextColor(Color textColor) { this.textColor = textColor; } public void setBackgroundColor(Color backColor) { this.backColor = backColor; } public void start() { if (runner == null) { runner = new Thread(this); runner.start(); } } public void stop() { runner = null; } public void run() { Thread thisThread = Thread.currentThread(); while (runner == thisThread) { xPos -= 1; repaint(); try { runner.sleep(25); } catch (InterruptedException ie) { } } } public void paintComponent(Graphics g) { int canvasWidth = getSize().width, canvasHeight = getSize().height, yPos = (canvasHeight - fontHeight) / 2 + fontHeight - fontDescent; g.setColor(backColor); g.fillRect(0, 0, canvasWidth, canvasHeight); g.setColor(textColor); g.setFont(font); if (xPos > canvasWidth) { xPos = canvasWidth; } if (xPos < 0) { if (xPos <= -strWidth) { xPos = canvasWidth - strWidth; } else { g.drawString(text, canvasWidth + xPos, yPos); } } g.drawString(text, xPos, yPos); } }