Hour 16

Using Fonts and Color in Applets

A famous catchphrase from the television show Saturday Night Live during the 1980s was, "It's not how you feel, but how you look...and darling, you look MAH-ve-lous." The quote epitomized the philosophy of Fernando, comedian Billy Crystal's eternally tan and impeccably groomed celebrity. Regardless of what was going on in his life, as long as his hair was styled properly and he was dressed for the occasion, everything was copacetic. After all, though Fernando hadn't been in a hit movie since Won Ton Ton, the Dog Who Saved Hollywood, he still looked good. Correction: He looked MAH-ve-lous.

If you're interested in making your Java applets look MAH-ve-lous, you should know about the Font and Color classes. No self-respecting applet would be seen in public without them. With these classes, you can present text in several different fonts and sizes and change the colors of text, graphics, and other elements.

One of the principles of object-oriented programming is to make an object work for itself, and the Font and Color objects follow this rule. They store all the information that's needed to display a font or change a color, and they can handle other related tasks that are required. The following topics will be covered during this hour:

Using the Font Class

There are three things you need to know about a font in order to display it:

Before you can display text in a certain typeface, style, and point size, you need to create a Font object that holds this information. The following statement creates a 12-point Times Roman italic Font object:

Font currentFont = new Font("TimesRoman", Font.ITALIC, 12);

The typeface that you can select may vary depending on the system you're using. The current release of the Java Developer's Kit for Windows 95 includes Helvetica, Courier, Dialog, Dialog Input, and Times Roman.

You choose the style of the font by using one or more constant variables. Specifying the style as Font.PLAIN makes it nonbold and nonitalic, Font.BOLD makes it bold, and Font.ITALIC makes it italic. To combine bold and italic, use Font.BOLD+Font.ITALIC, as in the following code:

Font headlineFont = new Font("Courier", Font.BOLD+Font.ITALIC, 72);

The last argument specifies the point size of the font. To see a simple example of using fonts in an applet, open your word processor and create a new file called Fonts.java. Enter the text of Listing 16.1 and save the file.

Listing 16.1. The full text of Fonts.java.


 1: import java.awt.*;
 2:
 3: public class Fonts extends java.applet.Applet {
 4:
 5:     public void paint(Graphics screen) {
 6:         Font currentFont = new Font("TimesRoman", Font.PLAIN, 20);
 7:         screen.setFont(currentFont);
 8:         screen.drawString("If I've said it once, I've said it a thousand 	 9:         times, darling,", 5, 50);
10:         currentFont = new Font("TimesRoman", Font.ITALIC, 40);
11:         screen.setFont(currentFont);
12:         screen.drawString("you look MAH-VE-LOUS", 5, 80);
13:     }
14: } 


After you compile the file with the javac compiler tool, you need to create a Web page that contains the applet. Create a new file in your word processor called Fonts.html and enter the text of Listing 16.2.

Listing 16.2. The full text of Fonts.html.


1: <applet code="Fonts.class" height=125 width=450>
2: </applet> 

Save this file and then load this page into the appletviewer tool by using the following command:

appletviewer Fonts.html

The output should resemble Figure 16.1.

Figure 16.1. The output of the Fonts applet.

Using the Color Class

The simplest way to use a color in a Java program is to use one of the constant variables from the Color class. You can use the following constants: black, blue, cyan, darkGray, gray, green, lightGray, magenta, orange, pink, red, white, and yellow.

In an applet, you can set the background color of the applet window using these constants. The following is an example:

setBackground(Color.orange);

When you want to display text of a certain color or draw other graphics in different colors, you have to use a method that sets up the current color. You can do this from within the paint() method of an applet by using a setColor() method, as in the following:

public void paint(Graphics screen) {
    screen.setColor(Color.orange);
    screen.drawString("Go, Buccaneers!", 5, 50);
}

Unlike the setBackground() method, which is inherited directly from the Applet class, the setColor() method must be used on an object that can handle a color change. The preceding example shows the setColor() method of the screen object being used to change the current color of the applet window.

Other Ways to Choose Colors

To use a color not included in the 13 constant variables, you must specify the color's RGB or HSB values. RGB, which stands for Red Green Blue, defines a color by the amount of red, green, and blue that is present in the color. Each value ranges from 0, which means there is none of that color, to 255, which means the maximum amount of that color is present. Most graphics editing and drawing programs will identify a color's RGB values.

If you know a color's RGB values, you can use it to create a Color object. For example, an RGB value for dark red is 235 red, 50 green, and 50 blue, and an RGB value for light orange is 230 red, 220 green, and 0 blue. The following is an example of an applet that displays dark red text on a light orange background:

import java.awt.*;

public class GoBucs extends java.applet.Applet {

    public void init() {
        Color lightOrange = new Color(230, 220, 0);
        setBackground(lightOrange);
    }

    public void paint(Graphics screen) {
        Color darkRed = new Color(235, 50, 50);
        screen.setColor(darkRed);
        screen.drawString("Go, Buccaneers!", 5, 50);
    }
}

Dark red on a light orange background isn't much more attractive on a Java applet than it is on the National Football League's Tampa Bay Buccaneers. Using RGB values enables you to select from more than 16.5 million possible combinations, although most computer monitors can only offer a close approximation for most of them. For guidance on whether light-light-light-semidark-midnight-blue goes well with medium-light-semidark-baby-green, purchase a copy of the upcoming Teach Yourself Color Sense While Waiting in Line at This Bookstore from Sams.net Publishing.

Another way to select a color in a Java program is the HSB system, which stands for Hue Saturation Brightness. Each of these is a floating-point number that ranges from 0.0 to 1.0. The HSB system isn't as commonly supported in graphics software, so you won't be using it as often in your programs as you use RGB values. However, one thing HSB values are convenient for is changing a color's brightness without changing anything else about the color. You'll see an example of this use and an example of using HSB values to choose a color in this hour's workshop.

Workshop: Displaying a Danger Message

You can use Java applets to present news headlines and other information in different ways. One special effect you might see on a Web page is text that fades to black. You also might see the reverse--text that brightens from black to white. This hour's workshop uses the Font and Color classes to create text that cycles in brightness from dark to bright. The text looks like an alert about impending danger, so the applet will be called Danger.

To make the applet more useful, the text of the warning will be set from a parameter on a Web page. The text that will be used in this example warns of a "Core breach in Sector 12," but you can substitute other threatening text of similar length.

If you're at a secure place in your life right now and can't think of anything suitably menacing, feel free to choose one of the following:

Create a new file in your word processor called Danger.java. Each section of the applet will be described as you enter it. Begin with the following statements:

import java.awt.*;

public class Danger extends java.applet.Applet {
    String text = "No text has been specified";
    float hue = (float) 0.5;
    float saturation = (float) 0.8;
    float brightness = (float) 0.0;
    Font textFont = new Font("Dialog", Font.BOLD, 20);
    int textX;

The program begins like most applets that you will create. The java.awt classes, such as Font, Color, and FontMetrics, are made available for use in this program with the import statement. The class statement defines Danger as a subclass of the Applet class, as all applets must be.

The next several lines define variables and objects that will be used during the program. The string variable text is created with a default value, and it will be used to store the text that should be displayed on-screen. Three floating-point variables are used to store values for a color using its Hue Saturation Brightness (HSB) ratings. The (float) portion of each line converts the value that follows it into a floating-point number. This conversion must be done because the hue, saturation, and brightness variables must be of type float.

The text of the applet will be displayed in 20-point Dialog bold. In order to do this, you need to create a Font object to store that font's values. The Font object called textFont is created for this purpose. Finally, the integer variable textX will be used when you're centering text from left-to-right on the screen.

After inserting a blank line, continue entering the Danger program by entering the init() method of the applet:

public void init() {
    setBackground(Color.black);
    String paramName = getParameter("TEXT");
    if (paramName != null)
        text = paramName;
    FontMetrics fm = getFontMetrics(textFont);
    textX = size().width / 2 - fm.stringWidth(text) / 2;
}

The init() method is handled once when the applet is first run, and then it is never handled again. It's a good place to set up some things that weren't set up when variables and objects were created. The first thing that happens in this method is the background of the applet is set to black by using the setBackground() method inherited by Danger from the Applet class.

Next, the parameter called TEXT is retrieved from the Web page that contains this applet. If no parameter is found, the default text stored in text will be displayed. Otherwise, the text specified by the parameter will be stored in text.

The FontMetrics class measures how wide a line of text will appear when it is displayed. Using the stringWidth() method of FontMetrics and the applet's size() method, you can center text on-screen. The textX variable stores the horizontal position where the text should be displayed.

Now continue by entering the paint() method of your class, which is called whenever the display on-screen needs to be updated. Leave a blank line after the init() method and enter the following:

public void paint(Graphics screen) {
    Color textColor = Color.getHSBColor(hue, saturation, brightness);
    screen.setColor(textColor);
    screen.setFont(textFont);
    screen.drawString(text, textX, 30);
    pause(250000);
    brightness += 0.05;
    if (brightness > 1) {
        brightness = (float) 0.0;
        pause(250000);
    }
    repaint();
}

The paint() method takes a Graphics object called screen as an argument. This object holds all the information needed to display something on-screen, and it has several methods you'll use.

The Color object called textColor is created using the HSB variables to select the color. The textColor object then becomes the current display color using the setColor() method of screen.

Using the drawString() method of screen, the variable text is displayed at the (x,y) position of textX and 30. The color of the text is the current display color. After the text has been displayed, a pause() method is called with an argument of 250,000. You'll see what this method does when you add it to your program.

In order for the text to change in brightness, you have to change the value of the brightness variable. The program increases the variable .05 (a 5 percent change), and if the variable has reached the maximum brightness of 1.0, it is reset to 0.0. Whenever brightness must be reset to 0.0, the program calls the pause() method.

The last thing that takes place in the paint() method is the repaint(); statement. You use this statement any time you need to redraw the screen because something has changed. Because the brightness variable has changed, you know there's a need to redisplay the text at the new brightness. The repaint() statement causes the paint() method to begin again.

The paint() method handles most of the work that takes place during the Danger applet. All you have left to add are two short methods called update() and pause(). Enter a blank line at the end of your program, and then continue with the following statements:

public void update(Graphics screen) {
    paint(screen);
}

void pause(int duration) {
    for (int pause = 0; pause < duration; pause++);
}

}

The update()method is one of the methods that normally works behind the scenes as an applet runs. It is handled any time the screen needs to be repainted or the repaint() statement is used. The update() method clears the screen and calls on paint() to do its work. However, clearing the screen when you're changing graphics or text often causes things to flicker badly in a Java program. In this code, you're overriding the update() method so it does not clear the screen at all, which will improve the quality of your applet's display. You'll learn more about this procedure during Hour 18, "Creating Animation."

The last thing in your applet is the pause() method, which takes an argument called duration. The method runs an empty for loop ranging from 0 to the value of duration. This loop causes the program to pause. The higher the value of duration, the longer the pause. When you are displaying changing graphics or text, you might need pauses of some kind to prevent things from changing too quickly. This pause() method is one way to create these pauses.

Save the Danger.java file, which should resemble Listing 16.3. The only difference might be in the way you have indented methods and other statements. That does not have to be changed in order for the program to run, but indentation and other spacing can make a program easier to understand.

Listing 16.3. The full text of Danger.java.


 1: import java.awt.*;
 2:
 3: public class Danger extends java.applet.Applet {
 4:    String text = "No text has been specified";
 5:    float hue = (float) 0.5;
 6:    float saturation = (float) 0.8;
 7:    float brightness = (float) 0.0;
 8:    Font textFont = new Font("Dialog", Font.BOLD, 20);
 9:    int textX;
10:
11:    public void init() {
12:        setBackground(Color.black);
13:        String paramName = getParameter("TEXT");
14:        if (paramName != null)
15:            text = paramName;
16:        FontMetrics fm = getFontMetrics(textFont);
17:        textX = size().width / 2 - fm.stringWidth(text) / 2;
18:    }
19:
20:    public void paint(Graphics screen) {
21:        Color textColor = Color.getHSBColor(hue, saturation, brightness);
22:        screen.setColor(textColor);
23:        screen.setFont(textFont);
24:        screen.drawString(text, textX, 30);
25:        pause(250000);
26:        brightness += 0.05;
27:        if (brightness > 1) {
28:            brightness = (float) 0.0;
29:            pause(250000);
30:        }
31:        repaint();
32:    }
33:
34:    public void update(Graphics screen) {
35:        paint(screen);
36:    }
37:
38:    void pause(int duration) {
39:        for (int pause = 0; pause < duration; pause++);
40:    }
41:
42: } 


After compiling the file with the javac compiler tool, you need to create a Web page that contains the Danger applet. Create a new file with your word processor called Danger.html, and enter the text of Listing 16.4 into the file.

Listing 16.4. The full text of Danger.html.


1: <applet code="Danger.class" height=60 width=400>
2: <param name="TEXT" value="Core breach in Sector 12">
3: </applet> 


You can change the value in Line 2 to any other menacing sounding text, as long as it is similar in size to Core breach in Sector 12. Use the appletviewer tool to view the Web page with the following command:

appletviewer Danger.html

Figure 16.2 shows the output of the Danger applet.

Figure 16.2. A screen capture of the Danger applet as it runs with the appletviewer tool.

Summary

Now that you can use Font and Color objects in your programs to change the color scheme, you can no longer feign ignorance when it comes to designing an attractive applet. By using fonts and color instead of sticking to the familiar black text on a light gray background, you can draw more attention to elements of your programs and make them more compelling for users. You also, of course, can write programs that look MAH-ve-lous. It's what Fernando would want you to do.

Q&A

Q Is there a limit to the point size that can be used for text?

A
The limiting factor is the height and width of your applet window or the part of an applet the text is supposed to be displayed in. Point sizes typically range from 9-point text for small lines that are readable to 48-point text for large headlines. Choosing the right size depends on the font typeface as well as the size, so it's largely a matter of trial and error.

Q What happens if a color defined in a Java program can't be displayed on the monitor of someone displaying the program? For example, if my monitor is set to display only 256 colors, what will occur if I choose one of the 16.5 million colors that isn't in those 256?

A
When a monitor can't display a color selected with a setColor() or setBackground() method, it shows the closest existing color as a substitute. An example of this kind of substitution is the Danger applet, which runs differently depending on the number of colors that can be shown as the text cycles from black to light blue to white.

Quiz

Test whether your font and color skills are MAH-ve-lous by answering the following questions.

Questions

1. Which one of the following is not a constant used to select a color?

(a) Color.cyan
(b) Color.teal
(c) Color.magenta

2.
When you change the color of something and redraw it on an applet window, what must you do to make it visible?

(a) Use the drawColor() method.
(b) Use the repaint() statement.
(c) Do nothing.

3.
What do the initials HSB stand for?

(a) Hue Saturation Brightness
(b) Hue Shadows Balance
(c) Lucy in the Sky with Diamonds

Answers

1. b.

2.
b. The call to repaint() causes the paint() method to be manually called.

3.
a. If c were the right answer, you could use colors that would only be visible years later during flashbacks.

Activities

To further explore the spectrum of possibilities when using fonts and color in your programs, do the following activities: