The JavaTM Tutorial
Previous Page Lesson Contents Next Page Start of Tutorial > Start of Trail > Start of Lesson Search

Trail: Creating a GUI with JFC/Swing
Lesson: Using Swing Components

How to Use Labels

With the JLabel(in the API reference documentation) class, you can display unselectable text and images. If you need to create a component that displays a string or an image (or both), optionally reacting to user input, you can do so by using or extending JLabel. If the interactive component has state, then you should probably use a button instead of a label.

Here's a picture of an application that displays three labels. The window is divided into three rows of equal height; the label in each row is as wide as possible.

A snapshot of LabelDemo, which uses labels with text and icons.


Try this: 
  1. Compile and run the application. The source code is in LabelDemo.java, and the image is middle.gif.
    See Getting Started with Swing if you need help compiling or running this application.
  2. Resize the window so you can see how the labels' contents are placed with the labels' drawing area.
    All the label contents have the default vertical alignment -- the label contents are centered vertically in the label's drawing area. The top label, which contains both image and text, is specified to have horizontal center alignment. The second label, which contains just text, has the left alignment that is the default for text-only labels. The third label, which contains just an image, has horizontal center alignment, which is the default for image-only labels.

Below is the code from LabelDemo.java that creates the labels in the previous example.

ImageIcon icon = new ImageIcon("images/middle.gif");
. . .
label1 = new JLabel("Image and Text",
		    icon,
		    JLabel.CENTER);
//Set the position of the text, relative to the icon:
label1.setVerticalTextPosition(JLabel.BOTTOM);
label1.setHorizontalTextPosition(JLabel.CENTER);

label2 = new JLabel("Text-Only Label");

label3 = new JLabel(icon);

//Add labels to the JPanel. 
add(label1);
add(label2);
add(label3);
Note that label alignment is different from X and Y alignment. X and Y alignment are used by layout managers and can affect the way any component -- not just a label -- is sized or positioned. Label alignment, on the other hand, has no effect on a label's size or position. It simply determines where, inside the label's painting area, the label's contents are positioned. In the usual case, the label's painting area is exactly the size needed to paint the label, and thus label alignment is irrelevant. For more information about X and Y alignment, see How to Use BoxLayout(in the Creating a User Interface trail).

Often, a label describes another component. When this is true, you can improve your program's accessibility by using the setLabelFor method to identify the component the label describes. For example:

amountLabel.setLabelFor(amountField);
The preceding code, taken from the TextFieldDemo example discussed in How to Use Text Fields, lets assistive technologies know that the label (amountLabel) provides information about the text field (amountField). For more information about assistive technologies, see How to Support Assistive Technologies(in the Creating a User Interface trail).

Using HTML on a Label


Note:  The information in this section documents a feature available only in Swing 1.1.1 Beta 1 or compatible releases.
Have you ever wanted to put multiple lines on a label? Have you ever wanted to make part of a label bold or italic? Now you can. As of Swing 1.1.1 Beta 1, JLabel supports multiple lines, multiple fonts, and a whole lot more because you can specify a label's text using HTML.

Here's an application that dynamically sets the text on a label.

A snapshot of HtmlDemo, which lets you customize a label with HTML.


Try this: 
  1. Compile and run the application. The source code is in HtmlDemo.java.
    See Getting Started with Swing if you need help compiling or running this application. Make sure you compile this program and run it using Swing 1.1.1 Beta 1 or a compatible release.
  2. Edit the HTML in the text area at the left and click the Change the label button. The label at the right shows the result.
  3. Remove <html> from the text area on the left. The label at the right shows the result.

The action listener for the button executes this single line of code:
theLabel.setText(htmlTextArea.getText());
If the string in the text area on the left begins with <html>, then the label parses it as HTML. Otherwise, the label assumes it's straight text.

Because this is an early release of this feature, there are some gotchas to be aware of:

As of Swing 1.1.1 Beta 1, you can use HTML to set the text for labels and buttons. In the near future, many more Swing components -- tool tips, tabbed panes, and menu items, for example -- will support HTML.

Warning:  There is no programmatic way to test whether a component supports HTML text. Do not specify HTML text unless you are absolutely sure that your program is running in a release that supports HTML text in the desired component.

The Label API

The following tables list the commonly used JLabel constructors and methods. Other methods you're likely to call are defined by the Component and JComponent classes. They include setFont, setForeground, setBorder, setOpaque, and setBackground. See The JComponent Class for details. The API for using labels falls into three categories:

Setting or Getting the Label's Contents
Method or Constructor Purpose
JLabel(Icon)
JLabel(Icon, int)
JLabel(String)
JLabel(String, Icon, int)
JLabel(String, int)
JLabel()
Create a JLabel instance, initializing it to have the specified text/image/alignment. The int argument specifies the horizontal alignment of the label's contents within its drawing area. The horizontal alignment must be one of the following constants defined in the SwingConstants(in the API reference documentation) interface (which JLabel implements): LEFT, CENTER, RIGHT, LEADING, or TRAILING.
void setText(String)
String getText()
Set or get the text displayed by the label.
void setIcon(Icon)
Icon getIcon()
Set or get the image displayed by the label.
void setDisplayedMnemonic(char)
char getDisplayedMnemonic()
Set or get the letter that should look like a keyboard alternative. This is handy when a label describes a component (such as a text field) that has a keyboard alternative but can't display it.
void setDisabledIcon(Icon)
Icon getDisabledIcon()
Set or get the image displayed by the label when it's disabled. If you don't specify a disabled image, then the look-and-feel creates one by manipulating the default image.

Fine Tuning the Label's Appearance
Method Purpose
void setHorizontalAlignment(int)
void setVerticalAlignment(int)
int getHorizontalAlignment()
int getVerticalAlignment()
Set or get where in the label its contents should be placed. The SwingConstants(in the API reference documentation) interface defines five possible values for horizontal alignment: LEFT (the default for text-only labels), CENTER (the default for image-only labels), RIGHT, LEADING, and TRAILING. For vertical alignment: TOP, CENTER (the default), and BOTTOM.
void setHorizontalTextPosition(int)
void setVerticalTextPosition(int)
int getHorizontalTextPosition()
int getVerticalTextPosition()
Set or get where the button's text should be placed, relative to the button's image. The SwingConstants(in the API reference documentation) interface defines three possible values for horizontal position: LEFT, CENTER, and RIGHT (the default). For vertical position: TOP, CENTER (the default), and BOTTOM.
void setIconTextGap(int)
int getIconTextGap()
Set or get the number of pixels between the label's text and its image.

Supporting Accessibility
Method Purpose
void setLabelFor(component)
Component getLabelFor()
Set or get which component the label describes.

Examples that Use Labels

The following table lists some of the many examples that use labels.

Example Where Described Notes
LabelDemo This section Shows how to specify horizontal and vertical alignment, as well as aligning a label's text and image.
HtmlDemo This section Lets you experiment with specifying HTML text for a label.
AlignmentDemo Fixing Alignment Problems Demonstrates a possible alignment problem when using a label in a vertical box layout. Shows how to solve the problem.
DialogDemo How to Use Dialogs Uses a changeable label to display instructions and provide feedback.
SplitPaneDemo How to Use Split Panes and How to Use Lists. Displays an image using a label inside of a scroll pane.
SliderDemo2 How to Use Sliders Uses JLabel to provide labels for a slider.
TableDialogEditDemo How to Use Tables Implements a label subclass, ColorRenderer, to display colors in table cells.
TextFieldDemo How to Use Text Fields Has four rows, each containing a label and the text field it describes.
TextComponentDemo General Rules for Using Text Components Has an inner class (CaretListenerLabel) that extends JLabel to provide a label that listens for events, updating itself based on the events. To run the example, you also need LimitedStyledDocument.java.
ColorChooserDemo How to Use Color Choosers Uses an opaque label to display the currently chosen color against a fixed-color background.


Previous Page Lesson Contents Next Page Start of Tutorial > Start of Trail > Start of Lesson Search