RainbowText


/** RainbowText.java
    Display text in changing rainbow colors.
    @author Glenn A. Richard
    @version 2.0, November 24, 1996
    Center for High Pressure Research
    ESS Building
    SUNY at Stony Brook
    Stony Brook, NY 11794
*/
import java.awt.*;

public class RainbowText extends java.applet.Applet
    implements Runnable {
  private String textStr = null;
  private String fontName;
  private int fontStyle;
  private int fontSize;
  private Color bgColor;
  private int sleepTime;
  private String paramStr;
  private int strlen;
  private Thread runner = null;
  private char theChars[];
  private int charOffsets[];
  private Color colors[];
  private int yOffset;
  private int phase = 0;
  private Image offScreenImage;
  private Graphics offScreenG;
  private Font f;
  private FontMetrics fm;
  private boolean stopped = false;
  private String pinfo[][]={
    {"text", "String", "Text to display (RainbowText)"},
    {"bgcolor", "hex rrggbb color", "Background color in rrggbb format (000000)"},
    {"fontname", "String", "Name of the font (TimesRoman)"},
    {"fontstyle", "String", "B = bold, I = italic, BI = both ()"},
    {"fontsize", "int", "Point size to be used (36)"},
    {"sleeptime", "int", "Milliseconds for sleep time (100)"}
  };

  public void init() {
    float h;
    int xPos=20;
    paramStr = getParameter("bgcolor");
    if (paramStr == null)
      bgColor = Color.black;
    else try {
      bgColor = new Color(Integer.parseInt(paramStr, 16));
    }
    catch (NumberFormatException e) {
      bgColor=Color.black;
    }
    setBackground(bgColor);
    textStr = getParameter("text");
    if (textStr == null) {
	  textStr = "RainbowText";
    }
    fontName = getParameter("fontname");
    if (fontName == null) {
	  fontName = "TimesRoman";
    }
    paramStr = getParameter("fontstyle");
    if (paramStr == null)
      fontStyle = Font.PLAIN;
    else if (paramStr.equals("B"))
	  fontStyle = Font.BOLD;
    else if (paramStr.equals("I"))
	  fontStyle = Font.ITALIC;
    else if (paramStr.equals("BI"))
	  fontStyle = Font.BOLD | Font.ITALIC;
    else
      fontStyle = Font.PLAIN;
    paramStr = getParameter("fontsize");
    if (paramStr == null)
	  fontSize = 36;
    else try {
      fontSize = Integer.parseInt(paramStr);
    } catch (Exception e) {
      fontSize = 36;
    }
    paramStr = getParameter("sleeptime");
    if (paramStr == null)
	  sleepTime = 100;
    else try {
      sleepTime = Integer.parseInt(paramStr);
    } catch (Exception e) {
      sleepTime = 100;
    }
    f=new Font(fontName,fontStyle,fontSize);
    fm=getFontMetrics(f);
    resize(40+fm.stringWidth(textStr),10+fm.getHeight());
    yOffset = fm.getAscent()+5;
    strlen = textStr.length();
    theChars =  new char [strlen];
    charOffsets = new int [strlen];
    textStr.getChars(0,strlen,theChars,0);
    colors = new Color[strlen];
    for (int i = 0; i < strlen; i++) {
      h = ((float)i)/((float)strlen);
      colors[i] = new Color(Color.HSBtoRGB(h,1.0f,1.0f));
      charOffsets[i] = xPos;
      xPos+=fm.charWidth(theChars[i]);
    }
    offScreenImage = createImage(this.size().width,this.size().height);
    offScreenG = offScreenImage.getGraphics();
    offScreenG.setColor(bgColor);
    offScreenG.fillRect(0,0,this.size().width,this.size().height);
    offScreenG.setFont(f);
  }

  public void start() {
    if(runner == null) {
      runner = new Thread(this);
      runner.start();
    }
  }

  public void stop() {
    if (runner != null && runner.isAlive())
      runner.stop();
    runner = null;
  }

  public void run() {
    showStatus("Click to stop "+getClass().getName());
    while (runner != null) {
      repaint();
	  try {
	    Thread.sleep(sleepTime);
	  }
	  catch (InterruptedException e) { }
    }
  }

  public void update(Graphics g) {
    int x, y;
    phase--;
    if (phase < 0)
      phase=strlen-1;
    for(int i=0;i<strlen;i++)
     {
       x = charOffsets[i];
       offScreenG.setColor(colors[(phase+i)%strlen]);
       offScreenG.drawChars(theChars,i,1,x,yOffset);
     }
    paint(g);
  }

  public void paint(Graphics g) {
     g.drawImage(offScreenImage,0,0,this);
  }

  public boolean handleEvent(Event e) {
    if (e.id == Event.MOUSE_DOWN) {
        if (runner != null && runner.isAlive()) {
            if (stopped) {
                showStatus("Click to stop "+getClass().getName());
                runner.resume();
            }
            else {
                showStatus("Click to restart "+getClass().getName());
                runner.suspend();
            }
            stopped = !stopped;
        }
        else {
            stopped = false;
            runner = new Thread(this);
            runner.start();
        }
    }
    else if (e.id == Event.MOUSE_ENTER)
      if (stopped)
        showStatus("Click to restart "+getClass().getName());
      else
        showStatus("Click to stop "+getClass().getName());
    else return super.handleEvent(e);
    return true;
  }

  public String[][] getParameterInfo() {
    return pinfo;
  }

  public String getAppletInfo() {
    return("Glenn A. Richard, CHiPR, SUNY at Stony Brook");
  }
}



Back to the RainbowText applet page

How to Add Java Applets to Your Site

New on the Java Boutique:

New Review:

Time Management Made Easy with the Quartz Enterprise Job Scheduler
Why not just use the Java timer API? This open source scheduling API boasts simplicity, ease-of-integration, a well-rounded feature set, and it's free!

New Applet:

Reverse Complement
Reverse Complement is a simple applet that converts DNA or RNA sequences into three useful formats.

Elsewhere on internet.com:

WebDeveloper Java
Lots of Java information on webdeveloper.com

WDVL Java
Thorough Java resource at the Web Developer's Virtual Library.

ScriptSearch Java
Hundreds of free Java code files to download.

jGuru: Your View of the Java Universe
Customizable portal with online training, FAQs, regular news updates, and tutorials.