Home Segments Top Top Previous Next

886: Mainline

Of course, you can substitute any statement you like for the print statement in Segment 885. For example, you can arrange for a thread to increment the position of the text displayed on a component.

Suppose that you decide to define a Marquee class such that instances can display a message, provided via a constructor, at a position dictated by the values of the position and drop instance variables.

The paint method uses the graphics context to display the message in a large bold font. If the value of the ready variable is false, then paint first uses the graphics context to initialize all instance variables, other than message:

import java.awt.*; 
import javax.swing.*; 
public class Marquee extends JComponent { 
 private String message; 
 private int position, drop, initialPosition, delta, messageWidth; 
 private Font messageFont = new Font("TimesRoman", Font.BOLD, 24); 
 private boolean ready = false; 
 public Marquee (String s) { 
  message = s; 
 } 
 public void decrementPosition() { 
  if (position + messageWidth < 0) { 
   position = initialPosition; 
  } 
  else { 
   position = position - delta; 
  } 
  repaint(); 
 } 
 public void paint(Graphics g) { 
  // Determine size: 
  Dimension d = getSize();  
  // Set font 
  g.setFont(messageFont); 
  if (initialPosition != d.width) {ready = false;} 
  if (!ready) { 
   // Set initial position to be the width: 
   position = initialPosition = d.width; 
   // Set the font and determine the message width: 
   FontMetrics f = g.getFontMetrics(); 
   messageWidth = f.stringWidth(message); 
   // Set delta to be equal to the width of the letter e: 
   delta = f.stringWidth("e"); 
   // Set drop so as to center the text vertically: 
   drop = (d.height + f.getHeight() + f.getDescent()) / 2; 
   ready = true; 
  } 
  System.out.println("Painting"); 
  g.drawString(message, position, drop); 
 } 
 public Dimension getMinimumSize() {return new Dimension(300, 50);} 
 public Dimension getPreferredSize() {return new Dimension(300, 50);} 

}