Chapter 19

Checkbox and TextField Controls


CONTNETS

As you learned in the previous chapter, label and button controls give you a couple of ways of presenting and retrieving information from the user. However, Java provides many other types of controls, each of which is adept at a certain type of interactivity with the user. Checkboxes, for example, are a lot like buttons, except that they enable the user to select from a list of options, whereas textfield controls enable the user to type information that your applet needs from the user. In this chapter, you learn about these important controls.

Checkboxes

Many applications (and applets) require that the user select from a list of options. Sometimes, the user can choose as many options as he or she likes (such as when combining various text attributes like bold and italic), and other times the user can select only one option in a list (such as when selecting a color). One way to provide these kinds of choices to your applet's users is to create and display checkbox controls.

To create a checkbox, you call the Checkbox class's constructor, like this:


Checkbox checkBox = new Checkbox(str, group, check);

Here, str is a text string for the checkbox's label, group is a reference to a CheckboxGroup object (used only for exclusive checkboxes), and a boolean value indicating whether the checkbox is selected (true) or not selected (false). After you create the checkbox, add it to the applet by calling the add() method, like this:


add(checkbox);

NOTE
When the user can select many options from a list of checkboxes, the checkboxes are being used nonexclusively. When only one checkbox in a group can be selected simultaneously, the checkboxes are being used exclusively. Java's Checkbox class enables you to include both types of checkboxes in your applets.

Example: Creating Nonexclusive Checkboxes

Suppose that you're writing an applet that requires the user to select from a list of books. Because you want the user to be able to select any, all, or none of the books, you want to set up checkboxes in nonexclusive mode. First, you create the checkboxes, as shown in Listing 19.1


Listing 19.1  LST19_1.TXT: Creating Nonexclusive Checkboxes.

checkbox1 =

    new Checkbox("The Adventures of Javaman", null, false);

checkbox2 =

    new Checkbox("Java by Example", null, false);

checkbox3 =

    new Checkbox("Java and the Single Guy", null, false);


As you know, the Checkbox constructor takes three agruments, which are the box's label, a reference to the checkbox's group, and a boolean value indicating whether the box should be displayed as checked. After creating the checkboxes, you add them to the applet:


add(checkbox1);

add(checkbox2);

add(checkbox3);

Now, when you run your applet, the user sees a list of checkboxes, like those shown in Figure 19.1. In the figure, none of the checkboxes has been selected. To select a checkbox, the user needs only to click the checkbox with the mouse. Because these are nonexclusive checkboxes, the user can select as many options as desired, as shown in Figure 19.2.

Figure 19.1 : Checkboxes enable the user to select from a list of options.

Figure 19.2 : Nonexclusive checkboxes enable the user to select as many options as desired.

Checkbox Groups

In order to create a list of exclusive checkboxes, you must first associate the checkboxes in the list with a CheckboxGroup object. The first step is to create the CheckboxGroup, like this:


CheckboxGroup group = new CheckboxGroup();

The CheckboxGroup constructor takes no arguments. After you create the CheckboxGroup object, you create the checkboxes themselves, giving a reference to the CheckboxGroup object as the constructor's second argument, as shown in Listing 19.2.


Listing 19.2  LST19_2.TXT: Creating Exclusive Checkboxes.

checkbox1 =

    new Checkbox("The Adventures of Javaman", group, true);

checkbox2 =

    new Checkbox("Java by Example", group, false);

checkbox3 =

    new Checkbox("Java and the Single Guy", group, false);


In Listing 19.2, notice that the CheckboxGroup object, group, is given as the second argument of the Checkbox class's constructor for each of the checkboxes in the list. This tells Java that the three checkboxes should all be placed into the same group and that they should be treated as exclusive checkboxes, meaning only one can be selected at a time. Notice also that the third argument for the first checkbox is true. This value tells Java that you want the first checkbox to be selected when Java displays the list.

As always, after creating the checkboxes, you must add them to the applet, by calling the add() method for each checkbox in the group:


add(checkbox1);

add(checkbox2);

add(checkbox3);

Now, when the applet appears, the user sees a list something like that shown in Figure 19.3. In the figure, the first option is selected. If the user decides to click a different option, the first option becomes unselected and the new one selected. Notice that exclusive checkboxes are round rather than square.

Figure 19.3 : Only one exclusive checkbox canbe selected simultaneously.

Checkbox Methods

Just like other controls supported by Java, the Checkbox class features a number of methods that you can call in order to manipulate the control or obtain information about it. Table 19.1 lists the public methods for the Checkbox class.

Table 19.1  Public Methods of the Checkbox Class.

MethodDescription
CheckboxGroup getCheckboxGroup() Returns the checkbox's group object.
String getLabel()Returns the checkbox's label.
boolean getState()Returns the checkbox's state.
void setCheckboxGroup(CheckboxGroup g) Sets the checkbox's group object.
void setLabel(String label)Sets the checkbox's label.
void setState(boolean state)Sets the checkbox's state.

The get methods listed in Table 19.1 requires no arguments and return objects of the appropriate type. The setCheckboxGroup() requires a reference to a CheckboxGroup object as its single argument, whereas setLabel() and setState() require a text string and a boolean value, respectively, as their single argument.

NOTE
Checkboxes that are set to exclusive mode are also known as radio buttons because, like the station-selection buttons on a radio, only one can be selected at a time.

Example: Handling Checkboxes in an Applet

Depending on what your applet needs to do, checkboxes can be handled in a couple of ways. The easiest way to handle checkboxes is to use their methods to determine the information you need in an applet. Listing 19.3, for example, is an applet that tracks the state of a set of checkboxes, displaying their current states every time there are changes. Listing 19.4 is the applet's HTML document, and Figure 19.4 shows the applet running under Appletviewer.

Figure 19.4 : CheckboxApplet running under Appletviewer.


Listing 19.3  CheckboxApplet.java: Handling Checkboxes in an Applet.

import java.awt.*;

import java.applet.*;



public class CheckboxApplet extends Applet

{

    Checkbox checkbox1;

    Checkbox checkbox2;

    Checkbox checkbox3;



    public void init()

    {

        checkbox1 = new Checkbox("Option 1", null, true);

        checkbox2 = new Checkbox("Option 2", null, false);

        checkbox3 = new Checkbox("Option 3", null, false);



        add(checkbox1);

        add(checkbox2);

        add(checkbox3);

    }



    public void paint(Graphics g)

    {

        Font font = g.getFont();

        FontMetrics fontMetrics = g.getFontMetrics(font);

        int height = fontMetrics.getHeight();



        boolean checked = checkbox1.getState();

        if (checked)

            g.drawString("Option1 selected", 20, 120);

        else

            g.drawString("Option1 not selected", 20, 120);



        checked = checkbox2.getState();

        if (checked)

            g.drawString("Option2 selected", 20, 120 + height);

        else

            g.drawString("Option2 not selected", 20, 120 + height);



        checked = checkbox3.getState();

        if (checked)

            g.drawString("Option3 selected", 20, 120 + 2 * height);

        else

            g.drawString("Option3 not selected", 20, 120 + 2 * height);

    }



    public boolean action(Event evt, Object arg)

    {

        repaint();

        return true;

    }

}


Tell Java that the applet uses the classes in the awt package.
Tell Java that the applet uses the classes in the applet package.
Derive the CheckboxApplet class from Java's Applet class.
Declare three checkbox objects.
Override the init() method.
Create the three checkboxes.
Add the checkboxes to the applet's display.
Override the paint() method.
Get the height of the active font.
Get the first checkbox's state and display the state.
Get the second checkbox's state and display the state.
Get the third checkbox's state and display the state.
Override the action() method.
Force Java to redraw the applet's display.
Tell Java that the event was handled okay.

Listing 19.4  CHECKBOXAPPLET.htmL: The HTML Document That Runs CheckboxApplet.

<title>Applet Test Page</title>

<h1>Applet Test Page</h1>

<applet

    code="CheckboxApplet.class"

    width=135

    height=220

    name="CheckboxApplet">

</applet>


Responding to a Checkbox Event

Most of Java's user-interface controls generate events when they're clicked. The checkbox controls are no different. However, unlike button controls, which send both a reference to the control and the control's label as parameters to the action() method, checkboxes send only a reference to the control, with the second action() parameter always being true. This anomaly makes it a little more difficult to handle checkbox controls when you need to respond directly to the event generated by the control.

To respond to a checkbox event, you must use the Event object's target field to call the checkbox's methods in order to determine which checkbox caused the event. If you don't remember, the Event object is passed as the action() method's first argument.

First, you obtain a reference to the checkbox, like this:


Checkbox checkbox = (Checkbox)evt.target;

Then, with a reference to the checkbox in hand, you can call whatever Checkbox class members you need in order to determine which checkbox caused the event and to deal with the event as appropriately. Probably the best way to determine which checkbox you're dealing with is to get the object's label, like this:


String label = checkbox.getLabel();

You can then compare the returned string to the labels for each checkbox object.

Example: Handling Checkbox Events in an Applet

To demonstrate how to use the previously presented technique in an actual programming situation, you'll now examine the CheckboxApplet2. The source code for the applet is shown in Listing 19.5. To create an HTML document for the applet, start with Listing 19.4 and then change all occurrences of CheckboxApplet with CheckboxApplet2.


Listing 19.5  CheckboxApplet2.java: Responding to Checkbox Events.

import java.awt.*;

import java.applet.*;



public class CheckboxApplet2 extends Applet

{

    Checkbox checkbox1;

    Checkbox checkbox2;

    Checkbox checkbox3;



    public void init()

    {

        checkbox1 = new Checkbox("Option 1", null, true);

        checkbox2 = new Checkbox("Option 2", null, false);

        checkbox3 = new Checkbox("Option 3", null, false);



     	add(checkbox1);

        add(checkbox2);

        add(checkbox3);

    }



    public boolean action(Event evt, Object arg)

    {

        if (evt.target instanceof Checkbox)

            ChangeLabel(evt);

        repaint();



        return true;

    }



    protected void ChangeLabel(Event evt)

    {

        Checkbox checkbox = (Checkbox)evt.target;

        String label = checkbox.getLabel();



        if (label == "Option 1")

            checkbox.setLabel("Changed 1");

        else if (label == "Option 2")

            checkbox.setLabel("Changed 2");

        else if (label == "Option 3")

            checkbox.setLabel("Changed 3");

        else

        {

            checkbox1.setLabel("Option 1");

            checkbox2.setLabel("Option 2");

            checkbox3.setLabel("Option 3");

        }

    }

}


Tell Java that the applet uses the classes in the awt package.
Tell Java that the applet uses the classes in the applet package.
Derive the CheckboxApplet2 class from Java's Applet class.
Declare three checkbox objects.
Override the init() method.
Create the three checkboxes.
Add the checkboxes to the applet's display.
Override the action() method.
If a checkbox caused the event, call the ChangeLabel() method.
Force Java to redraw the applet's display.
Tell Java that the event was handled okay.
Declare the ChangeLabel() method.
Cast the Event object to a Checkbox object.
Get the checkbox's label.
Change the label of the selected checkbox
Or else change all the labels back to their normal form.

When you run the CheckboxApplet2 applet, you see a display something like Figure 19.5. You can click on any of the checkboxes as normal, and their check state will change accordingly. However, when you click on a checkbox, its label will also change, as shown in Figure 19.6, proving that the applet is responding to the event generated by the checkbox. If you click on a checkbox that still has its original label, that label changes. If you click on a label that has already been changed, all the checkbox labels revert to their starting text.

Figure 19.5 : This is CheckboxApplet2 running under Appletviewer.

Figure 19.6 : Clicking the checkboxes changes their labels.

TextFields

You've already had a lot of experience with textfield controls. You've used these handy controls to implement text input for many of your previous applets. As you already know, a textfield object, which is an object of the TextField class, is much like a Windows edit control, providing a small box into which the user can type text. To create a textfield control, you call the TextField class's constructor, like this:


TextField textField = new TextField(str, size);

The constructor's two arguments are the default text that should be displayed in the textfield control and the size in characters of the control. After you create the control, add it to the applet by calling the add() method, like this:


add(textField);

TextField Methods

The TextField class features a number of public methods that you can use to manipulate textfield objects. By using these methods, you can set a textfield object's characteristics and obtain information about the object. Table 19.2 lists the most commonly used methods and their descriptions.

Table 19.2  Methods of the TextField Class.

MethodDescription
boolean echoCharIsSet()Returns true if the object's echo character is set. When set, echo characters appear in place of any character the user types.
int getColumns()Returns the size of the textfield object.
char getEchoChar()Returns the object's echo character, if set.
String getText()Gets the text from the textfield object.
void setEchoCharacter(char c) Sets the object's echo character.
void setText(String str)Sets the text in the textfield object.

Example: Using Echo Characters

You should already be pretty familiar with using textfield objects in applets because you've used them already many times in previous applets in this book. However, I've not yet mentioned echo characters, which enable you to create textfield objects that display a special character when the user types. The most common use for echo characters is to set up text entry for things like passwords.

Listing 19.6 is the source code for a short applet called EchoApplet that initializes a textfield object to use an asterisk as an echo character. Listing 19.7 is the applet's HTML document. When you run the applet and type something in the textfield control, you see the display in Figure 19.7. You can change the echo character by clicking on the Change Echo button. Then, when you click on the textfield control to enter text, the text in the control changes to the new echo character, as shown in Figure 19.8. The program switches between three different echo characters: an asterisk (*), a pound sign (#), and a dollar sign ($).

Figure 19.7 : When you start typing, you see asterisks instead of regular text characters.

Figure 19.8 : When you click the Change Echo button, the applet switches to a different echo character.


Listing 19.6  EchoApplet.java: Using Echo Characters.

import java.awt.*;

import java.applet.*;



public class EchoApplet extends Applet

{

    TextField textField;

    Button button;



    public void init()

    {

        textField = new TextField("", 25);

        button = new Button("Change Echo");



        textField.setEchoCharacter('*');



        add(textField);

        add(button);

    }



    public boolean action(Event evt, Object arg)

    {

        if (evt.target instanceof Button)

            ChangeEcho();



        return true;

    }



    protected void ChangeEcho()

    {

        char c = textField.getEchoChar();



        if (c == '*')

            textField.setEchoCharacter('#');

        else if (c == '#')

            textField.setEchoCharacter('$');

        else

            textField.setEchoCharacter('*');            

    }

}


Tell Java that the applet uses the classes in the awt package.
Tell Java that the applet uses the classes in the applet package.
Derive the EchoApplet class from Java's Applet class.
Declare textfield and button objects.
Override the init() method.
Create the textfield and button objects.
Set the textfield object's echo character to an asterisk.
Add the textfield and button objects to the applet's display.
Override the action() method.
If the button caused the event, call the ChangeEcho() method.
Tell Java that the event was handled okay.
Declare the ChangeEcho() method.
Get the current echo character.
Reset the echo character to the next in the series.

Listing 19.7  ECHOAPPLET.htmL: EchoApplet's HTML Document.

<title>Applet Test Page</title>

<h1>Applet Test Page</h1>

<applet

    code="EchoApplet.class"

    width=200

    height=150

    name="EchoApplet">

</applet>


NOTE
Because you've already had a lot of experience with textfield controls, you know that a textfield control generates an event when the user presses Enter after typing in the control. You can capture this event in the applet's action() method.

Summary

In this chapter, you discovered two new controls that will help you build useful applets. Whenever you need the user to select from a list of items, you can use checkbox controls, which can be created in both nonexclusive and exclusive modes. TextField controls, on the other hand, enable the user to enter text data into an applet. You can even disguise the user's entry by substituting the typed text with echo characters.

Review Questions

  1. What are the three arguments required by the Checkbox class's constructor?
  2. What's another name for checkboxes that are set for exclusive mode?
  3. What are the two arguments needed by the TextField class's constructor?
  4. What method do you call in order to change the state of a checkbox?
  5. What is the difference between the nonexclusive and exclusive modes for a checkbox control?
  6. What additional object do you need to group the items in a checkbox control?
  7. When would you use echo characters with a textfield control?
  8. How do you set a textfield control's echo character?
  9. How can you determine which checkbox in an applet generated an event?

Review Exercises

  1. Write an applet that displays a checkbox with the label Click here.
  2. Write an applet that displays a textfield control that displays the default text string Type here.
  3. Write an applet that contains one checkbox and textfield control. Change the checkbox's label to whatever the user types in the textfield control.
  4. Write an applet that contains three checkboxes in nonexclusive mode.
  5. Revise the applet from exercise 4 so that the checkboxes operate in exclusive mode.