Professional Documents
Culture Documents
Creating a graphical user interface with Swing involves more than learning how to use the different
interface components, layout managers, and event-handling methods. You also have to spend some
time familiarizing yourself with everything that Swing offers.
In the current version of Java 2, there are more than 400 different classes in Swing's javax.swing
library and other related libraries. Many of these classes can be implemented using the same
techniques you have used in the preceding three hours—all Swing containers and components share
superclasses with each other, which gives them common behavior.
During this hour, you will learn about some additional components that you can use in your Swing
programs:
Scroll panes—Containers that add support for vertical and horizontal scrolling to other
components
Image icons—Graphics that can be used on labels, buttons, and other components
Menu bars, menus, and menu items—Two containers and a component used to create pull-
down menus
Scroll Panes
Components in a graphical user interface are often bigger than the area available to display them. To
move from one part of the component to another, vertical and horizontal scrollbars are used—this is
standard behavior for a text area in software such as word processors and email programs.
In Swing, you offer scrolling by adding a component to a scroll pane, a container that is represented
by the JScrollPane class in Swing.
JScrollPane()— Create a scroll pane with a horizontal and vertical scrollbar that appear, if
they are needed
JScrollPane( int , int )— Create a scroll pane with the specified vertical scrollbar and
horizontal scrollbars
JScrollPane( Component )— Create a scroll pane that contains the specified user interface
component
JScrollPane( Component , int , int )— Create a scroll pane with the specified component,
vertical scrollbar, and horizontal scrollbar
The integers used as arguments to these constructors determine how scrollbars will be used in the
pane. Use the following class variables as these arguments:
JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED or
JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED
JScrollPane.VERTICAL_SCROLLBAR_NEVER or JScrollPane.HORIZONTAL_
SCROLLBAR_NEVER
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS or JScrollPane.HORIZONTAL_
SCROLLBAR_ALWAYS
If you have created a scroll pane without a component in it, you can use the pane's add( Component )
method to add components.
After you have finished setting up a scroll pane, it should be added to a container in place of the
component.
To see an application that includes a scroll pane, enter Listing 16.1 into a text editor and save it as
WriteMail.java.
1: import javax.swing.*;
2: import java.awt.*;
3:
4: class WriteMail extends JFrame {
5:
6: WriteMail() {
7: super("Write an E-Mail");
8: setSize(370, 270);
9: setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
10: Container pane = getContentPane();
11: FlowLayout flow = new FlowLayout(FlowLayout.RIGHT);
12: pane.setLayout(flow);
13: JPanel row1 = new JPanel();
14: JLabel toLabel = new JLabel("To:");
15: row1.add(toLabel);
16: JTextField to = new JTextField(24);
17: row1.add(to);
18: pane.add(row1);
19: JPanel row2 = new JPanel();
20: JLabel subjectLabel = new JLabel("Subject:");
21: row2.add(subjectLabel);
22: JTextField subject = new JTextField(24);
23: row2.add(subject);
24: pane.add(row2);
25: JPanel row3 = new JPanel();
26: JLabel messageLabel = new JLabel("Message:");
27: row3.add(messageLabel);
28: JTextArea message = new JTextArea(4, 22);
29: message.setLineWrap(true);
30: message.setWrapStyleWord(true);
31: JScrollPane scroll = new JScrollPane(message,
32: JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
33: JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
34: row3.add(scroll);
35: pane.add(row3);
36: JPanel row4 = new JPanel();
37: JButton send = new JButton("Send");
38: row4.add(send);
39: pane.add(row4);
40: setContentPane(pane);
41: setVisible(true);
42: }
43:
44: public static void main(String[] arguments) {
45: WriteMail mail = new WriteMail();
46: }
47: }
After you compile and run the application, you should see a window like the one in Figure 16.1.
The WriteMail application is a graphical user interface that is used to compose an email. There is no
event-handling code in the program, so you can't do anything with the data entered in the form.
The text of an email is entered in a scrolling text area, which is implemented with the following
statements:
Sliders
One of the easiest ways for a user to enter numeric input is by using a slider, a component that can be
dragged from side to side or up and down.
Sliders are represented in Swing by the JSlider class. Figure 16.2 shows what a slider component
looks like.
Sliders enable a number to be chosen from between a minimum and maximum range of values. These
values can be displayed on a label that includes the minimum value, maximum value, and
intermediate values (as shown later in Figure 16.3).
Figure 16.3 Choosing a color using slider components.
You can create a horizontal slider with one of the following constructors:
JSlider( int , int )— Create a slider with the specified minimum value and maximum value.
JSlider( int , int , int )— Create a slider with the specified minimum value, maximum value,
and starting value.
To create a vertical slider, you must use a constructor method with an additional argument—the
orientation of the slider. This argument should be the class variables JSlider.VERTICAL or
JSlider.HORIZONTAL.
The following statement creates a vertical slider that can be used to pick a number from 1 to 1,000:
This slider starts with the caret—the part of the component used to select a number—at the 500
position.
To display a label for a slider, you must set up the information that the label will contain. Call the
slider's setMajorTickSpacing( int ) and setMinorTickSpacing( int ) methods to determine how often a
tick mark will be displayed on the label. Major ticks are displayed as a thicker line than minor ticks.
After you have set up how often tick marks will appear, call the slider's setPaintTicks( boolean )
method with true as the argument.
You can also display the numeric value of each major tick by calling the slider's
The following statements can be used to create the slider shown in Figure 16.2:
Like other Swing components, a slider should be set up completely before you add it to the content
pane or any other container. Otherwise, it may not be displayed as intended, or might not be displayed
at all.
Change Listeners
To monitor the use of a slider in a Java program, you must have a class that implements the
ChangeListener interface, which is part of the javax.swing.event package of classes. This interface
includes only one method, which takes the following form:
To register an object as a change listener, call the addChangeListener( Object ) method of the
container that holds the slider. When the slider is moved, the listening object's stateChanged() method
will be called.
This method is called with a ChangeEvent object that can be used to identify the slider component
that was changed in value. Call the object's getSource() method and cast the object to a JSlider, as in
the following statement:
In this example, evt is the ChangeEvent object that was an argument to the stateChanged() method.
When you are using a change listener, it's important to note that change events occur throughout the
movement of a slider. They begin when the slider is first moved, and don't stop occurring until the
slider has been released.
For this reason, you might not want to do anything in the stateChanged() method until the slider has
stopped moving.
To see if a slider is currently being moved around, call its getValueIsAdjusting() method. This method
returns true while movement is taking place, and false otherwise.
This technique is demonstrated in your next project, a Java application that uses three sliders to
choose a color. Colors are created in Java by using the Color class, which is part of the java.awt
package.
One way to create a Color object is to specify the amount of red, green, and blue in the color. Each of
these can be an integer from 0 to 255, with 255 representing the maximum amount of that color.
For example, the following statement creates a Color object that represents the color butterscotch:
The red value used to create this Color object is 255, so it contains the maximum amount of red. It
also contains a large amount of green and some blue.
Colors can be represented by a range of values, so they are an ideal use for slider components.
Listing 16.2 contains the ColorSlide application, which has three sliders, three labels for the sliders,
and a panel where the color is displayed. Enter this source code into your word processor and save the
file as ColorSlide.java.
1: import javax.swing.*;
2: import javax.swing.event.*;
3: import java.awt.*;
4:
5: public class ColorSlide extends JFrame implements ChangeListener {
6: ColorPanel canvas = new ColorPanel();
7: JSlider red = new JSlider(0, 255, 255);
8: JSlider green = new JSlider(0, 255, 0);
9: JSlider blue = new JSlider(0, 255, 0);
10:
11: public ColorSlide() {
12: super("Color Slide");
13: setSize(270, 300);
14: setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
15: setVisible(true);
16: red.setMajorTickSpacing(50);
17: red.setMinorTickSpacing(10);
18: red.setPaintTicks(true);
19: red.setPaintLabels(true);
20: red.addChangeListener(this);
21: green.setMajorTickSpacing(50);
22: green.setMinorTickSpacing(10);
23: green.setPaintTicks(true);
24: green.setPaintLabels(true);
25: green.addChangeListener(this);
26: blue.setMajorTickSpacing(50);
27: blue.setMinorTickSpacing(10);
28: blue.setPaintTicks(true);
29: blue.setPaintLabels(true);
30: blue.addChangeListener(this);
31: JLabel redLabel = new JLabel("Red: ");
32: JLabel greenLabel = new JLabel("Green: ");
33: JLabel blueLabel = new JLabel("Blue: ");
34: GridLayout grid = new GridLayout(4, 1);
35: FlowLayout right = new FlowLayout(FlowLayout.RIGHT);
36: Container pane = getContentPane();
37: pane.setLayout(grid);
38: JPanel redPanel = new JPanel();
39: redPanel.setLayout(right);
40: redPanel.add(redLabel);
41: redPanel.add(red);
42: pane.add(redPanel);
43: JPanel greenPanel = new JPanel();
44: greenPanel.setLayout(right);
45: greenPanel.add(greenLabel);
46: greenPanel.add(green);
47: pane.add(greenPanel);
48: JPanel bluePanel = new JPanel();
49: bluePanel.setLayout(right);
50: bluePanel.add(blueLabel);
51: bluePanel.add(blue);
52: pane.add(bluePanel);
53: pane.add(canvas);
54: setContentPane(pane);
55: }
56:
57: public void stateChanged(ChangeEvent evt) {
58: JSlider source = (JSlider)evt.getSource();
59: if (source.getValueIsAdjusting() != true) {
60: Color current = new Color(red.getValue(), green.getValue(),
61: blue.getValue());
62: canvas.changeColor(current);
63: canvas.repaint();
64: }
65: }
66:
67: public Insets getInsets() {
68: Insets border = new Insets(45, 10, 10, 10);
69: return border;
70: }
71:
72: public static void main(String[] arguments) {
73: ColorSlide cs = new ColorSlide();
74: }
75: }
76:
77: class ColorPanel extends JPanel {
78: Color background;
79:
80: ColorPanel() {
81: background = Color.red;
82: }
83:
84: public void paintComponent(Graphics comp) {
85: Graphics2D comp2D = (Graphics2D)comp;
86: comp2D.setColor(background);
87: comp2D.fillRect(0, 0, getSize().width, getSize().height);
88: }
89:
90: void changeColor(Color newBackground) {
91: background = newBackground;
92: }
93: }
Compile and run the application. A frame will open that contains three sliders that represent the
amount of red, green, and blue in a panel along the bottom edge of the frame.
Adjust the values of each slider to change the color that is displayed. Figure 16.3 shows the
application being used to create North Texas Mean Green, a color that has a red value of 50, a green
value of 150, and a blue value of 50, a shade that inspires students and alumni of the University of
North Texas to leap to our feet and make ferocious eagle-claw hand gestures that put fear in our
rivals.
Menus
If you're creating a program that uses a frame, you can jazz it up with a menu bar, a set of pull-down
menus that is usually displayed below the title bar.
Menus in Java are created using three components: JMenuBar, JMenu, and JMenuItem.
A JMenuItem component is an item on a menu. It serves the same purpose as a button—click an item
to make something happen.
A JMenu container holds JMenuItem components, lines that separate menu items, and other interface
components, such as check boxes.
These three work together more closely than members of the Osmond Family. For example, you could
put an Exit button on a menu so users can exit the program. This button could be put in a File menu,
which is then placed in a menu bar, displaying the name File, along with other menu names below a
frame's title bar.
A JMenuItem component can be set up using the same constructor methods as a JButton component:
Call JMenuItem( String ) to create an item with the text of the item as the argument.
A JMenu container holds menu items. To create one, call the JMenu( String ) constructor with the
menu's name as the only argument. The following statement creates a menu titled Gamble:
After you have created a JMenu object, call its add( JMenuItem) method to add a menu item to it.
Each new item will be placed at the end of the menu, so you should add items in order from top to
bottom.
You can also add a text label: Call the add( String ) method with the text as an argument.
If you'd like to add something to a menu other than a JMenuItem or text, call a JMenu object's add(
Component ) method with a user interface component. The following statements create a check box
and add it to a menu:
Menus can also contain lines that are used to visually group related items together. To add a line
separator, call the addSeparator() method, which puts a line at the end of the menu.
Using the five menu items created earlier, the following statements create a menu and fill it with those
items and two separators:
After you have created all your menus and filled them with menu items, you're ready to add them to a
frame by putting them in a JMenuBar. JMenuBar, another container, holds JMenu objects and
displays each of their names, usually in a gray horizontal panel directly below an application's title
bar.
To create a menu bar, call the JMenuBar() constructor method with no arguments. Call the bar's add(
JMenu) method to add menus to the bar, beginning with the menu that should be displayed at the end
of the bar. (The end is the rightmost position on a horizontal bar and the bottom position on a vertical
bar.)
When the menu bar contains all of the menus it needs, add it to a frame by calling the frame's
setJMenuBar( JMenuBar) method.
The following statement finishes off the ongoing example by creating a menu bar, adding a menu to
it, then placing the bar on a frame called kenny:
Figure 16.4 shows what this menu looks like on an otherwise empty frame.
You already know how to handle events generated by these menu items, because JMenuItem objects
function like buttons, and can generate action events when they are selected. Other components such
as check boxes work the same way they do when placed in other containers.
Summary
This is the last of four hours devoted to Swing, the part of the Java language that supports windowing
software.
Java offers extensive support for the graphical user interface features expected by users of Microsoft
Windows and Apple Macintosh systems.
Although Swing is by far the largest part of the Java class library, most of the classes are used in
similar ways. Once you know how to create a component, add a component to a container, apply a
layout manager to a container, and respond to user input, you can make use of many new Swing
classes as you explore the language.