- •CONTENTS
- •1.1 Introduction
- •1.2 What Is a Computer?
- •1.3 Programs
- •1.4 Operating Systems
- •1.5 Java, World Wide Web, and Beyond
- •1.6 The Java Language Specification, API, JDK, and IDE
- •1.7 A Simple Java Program
- •1.8 Creating, Compiling, and Executing a Java Program
- •1.9 (GUI) Displaying Text in a Message Dialog Box
- •2.1 Introduction
- •2.2 Writing Simple Programs
- •2.3 Reading Input from the Console
- •2.4 Identifiers
- •2.5 Variables
- •2.7 Named Constants
- •2.8 Numeric Data Types and Operations
- •2.9 Problem: Displaying the Current Time
- •2.10 Shorthand Operators
- •2.11 Numeric Type Conversions
- •2.12 Problem: Computing Loan Payments
- •2.13 Character Data Type and Operations
- •2.14 Problem: Counting Monetary Units
- •2.15 The String Type
- •2.16 Programming Style and Documentation
- •2.17 Programming Errors
- •2.18 (GUI) Getting Input from Input Dialogs
- •3.1 Introduction
- •3.2 boolean Data Type
- •3.3 Problem: A Simple Math Learning Tool
- •3.4 if Statements
- •3.5 Problem: Guessing Birthdays
- •3.6 Two-Way if Statements
- •3.7 Nested if Statements
- •3.8 Common Errors in Selection Statements
- •3.9 Problem: An Improved Math Learning Tool
- •3.10 Problem: Computing Body Mass Index
- •3.11 Problem: Computing Taxes
- •3.12 Logical Operators
- •3.13 Problem: Determining Leap Year
- •3.14 Problem: Lottery
- •3.15 switch Statements
- •3.16 Conditional Expressions
- •3.17 Formatting Console Output
- •3.18 Operator Precedence and Associativity
- •3.19 (GUI) Confirmation Dialogs
- •4.1 Introduction
- •4.2 The while Loop
- •4.3 The do-while Loop
- •4.4 The for Loop
- •4.5 Which Loop to Use?
- •4.6 Nested Loops
- •4.7 Minimizing Numeric Errors
- •4.8 Case Studies
- •4.9 Keywords break and continue
- •4.10 (GUI) Controlling a Loop with a Confirmation Dialog
- •5.1 Introduction
- •5.2 Defining a Method
- •5.3 Calling a Method
- •5.4 void Method Example
- •5.5 Passing Parameters by Values
- •5.6 Modularizing Code
- •5.7 Problem: Converting Decimals to Hexadecimals
- •5.8 Overloading Methods
- •5.9 The Scope of Variables
- •5.10 The Math Class
- •5.11 Case Study: Generating Random Characters
- •5.12 Method Abstraction and Stepwise Refinement
- •6.1 Introduction
- •6.2 Array Basics
- •6.3 Problem: Lotto Numbers
- •6.4 Problem: Deck of Cards
- •6.5 Copying Arrays
- •6.6 Passing Arrays to Methods
- •6.7 Returning an Array from a Method
- •6.8 Variable-Length Argument Lists
- •6.9 Searching Arrays
- •6.10 Sorting Arrays
- •6.11 The Arrays Class
- •7.1 Introduction
- •7.2 Two-Dimensional Array Basics
- •7.3 Processing Two-Dimensional Arrays
- •7.4 Passing Two-Dimensional Arrays to Methods
- •7.5 Problem: Grading a Multiple-Choice Test
- •7.6 Problem: Finding a Closest Pair
- •7.7 Problem: Sudoku
- •7.8 Multidimensional Arrays
- •8.1 Introduction
- •8.2 Defining Classes for Objects
- •8.3 Example: Defining Classes and Creating Objects
- •8.4 Constructing Objects Using Constructors
- •8.5 Accessing Objects via Reference Variables
- •8.6 Using Classes from the Java Library
- •8.7 Static Variables, Constants, and Methods
- •8.8 Visibility Modifiers
- •8.9 Data Field Encapsulation
- •8.10 Passing Objects to Methods
- •8.11 Array of Objects
- •9.1 Introduction
- •9.2 The String Class
- •9.3 The Character Class
- •9.4 The StringBuilder/StringBuffer Class
- •9.5 Command-Line Arguments
- •9.6 The File Class
- •9.7 File Input and Output
- •9.8 (GUI) File Dialogs
- •10.1 Introduction
- •10.2 Immutable Objects and Classes
- •10.3 The Scope of Variables
- •10.4 The this Reference
- •10.5 Class Abstraction and Encapsulation
- •10.6 Object-Oriented Thinking
- •10.7 Object Composition
- •10.8 Designing the Course Class
- •10.9 Designing a Class for Stacks
- •10.10 Designing the GuessDate Class
- •10.11 Class Design Guidelines
- •11.1 Introduction
- •11.2 Superclasses and Subclasses
- •11.3 Using the super Keyword
- •11.4 Overriding Methods
- •11.5 Overriding vs. Overloading
- •11.6 The Object Class and Its toString() Method
- •11.7 Polymorphism
- •11.8 Dynamic Binding
- •11.9 Casting Objects and the instanceof Operator
- •11.11 The ArrayList Class
- •11.12 A Custom Stack Class
- •11.13 The protected Data and Methods
- •11.14 Preventing Extending and Overriding
- •12.1 Introduction
- •12.2 Swing vs. AWT
- •12.3 The Java GUI API
- •12.4 Frames
- •12.5 Layout Managers
- •12.6 Using Panels as Subcontainers
- •12.7 The Color Class
- •12.8 The Font Class
- •12.9 Common Features of Swing GUI Components
- •12.10 Image Icons
- •13.1 Introduction
- •13.2 Exception-Handling Overview
- •13.3 Exception-Handling Advantages
- •13.4 Exception Types
- •13.5 More on Exception Handling
- •13.6 The finally Clause
- •13.7 When to Use Exceptions
- •13.8 Rethrowing Exceptions
- •13.9 Chained Exceptions
- •13.10 Creating Custom Exception Classes
- •14.1 Introduction
- •14.2 Abstract Classes
- •14.3 Example: Calendar and GregorianCalendar
- •14.4 Interfaces
- •14.5 Example: The Comparable Interface
- •14.6 Example: The ActionListener Interface
- •14.7 Example: The Cloneable Interface
- •14.8 Interfaces vs. Abstract Classes
- •14.9 Processing Primitive Data Type Values as Objects
- •14.10 Sorting an Array of Objects
- •14.11 Automatic Conversion between Primitive Types and Wrapper Class Types
- •14.12 The BigInteger and BigDecimal Classes
- •14.13 Case Study: The Rational Class
- •15.1 Introduction
- •15.2 Graphical Coordinate Systems
- •15.3 The Graphics Class
- •15.4 Drawing Strings, Lines, Rectangles, and Ovals
- •15.5 Case Study: The FigurePanel Class
- •15.6 Drawing Arcs
- •15.7 Drawing Polygons and Polylines
- •15.8 Centering a String Using the FontMetrics Class
- •15.9 Case Study: The MessagePanel Class
- •15.10 Case Study: The StillClock Class
- •15.11 Displaying Images
- •15.12 Case Study: The ImageViewer Class
- •16.1 Introduction
- •16.2 Event and Event Source
- •16.3 Listeners, Registrations, and Handling Events
- •16.4 Inner Classes
- •16.5 Anonymous Class Listeners
- •16.6 Alternative Ways of Defining Listener Classes
- •16.7 Problem: Loan Calculator
- •16.8 Window Events
- •16.9 Listener Interface Adapters
- •16.10 Mouse Events
- •16.11 Key Events
- •16.12 Animation Using the Timer Class
- •17.1 Introduction
- •17.2 Buttons
- •17.3 Check Boxes
- •17.4 Radio Buttons
- •17.5 Labels
- •17.6 Text Fields
- •17.7 Text Areas
- •17.8 Combo Boxes
- •17.9 Lists
- •17.10 Scroll Bars
- •17.11 Sliders
- •17.12 Creating Multiple Windows
- •18.1 Introduction
- •18.2 Developing Applets
- •18.3 The HTML File and the <applet> Tag
- •18.4 Applet Security Restrictions
- •18.5 Enabling Applets to Run as Applications
- •18.6 Applet Life-Cycle Methods
- •18.7 Passing Strings to Applets
- •18.8 Case Study: Bouncing Ball
- •18.9 Case Study: TicTacToe
- •18.10 Locating Resources Using the URL Class
- •18.11 Playing Audio in Any Java Program
- •18.12 Case Study: Multimedia Animations
- •19.1 Introduction
- •19.2 How is I/O Handled in Java?
- •19.3 Text I/O vs. Binary I/O
- •19.4 Binary I/O Classes
- •19.5 Problem: Copying Files
- •19.6 Object I/O
- •19.7 Random-Access Files
- •20.1 Introduction
- •20.2 Problem: Computing Factorials
- •20.3 Problem: Computing Fibonacci Numbers
- •20.4 Problem Solving Using Recursion
- •20.5 Recursive Helper Methods
- •20.6 Problem: Finding the Directory Size
- •20.7 Problem: Towers of Hanoi
- •20.8 Problem: Fractals
- •20.9 Problem: Eight Queens
- •20.10 Recursion vs. Iteration
- •20.11 Tail Recursion
- •APPENDIXES
- •INDEX
590 Chapter 17 Creating Graphical User Interfaces
17.8 Combo Boxes
A combo box, also known as a choice list or drop-down list, contains a list of items from which the user can choose. It is useful in limiting a user’s range of choices and avoids the cumbersome validation of data input. Figure 17.21 lists several frequently used constructors and methods in JComboBox.
FIGURE 17.21 JComboBox enables you to select an item from a set of items.
The following statements create a combo box with four items, red foreground, white background, and the second item selected.
JComboBox jcb = new JComboBox(new Object[] {"Item 1", "Item 2", "Item 3", "Item 4"});
jcb.setForeground(Color.red);
jcb.setBackground(Color.white); jcb.setSelectedItem("Item 2");
JComboBox can fire ActionEvent and ItemEvent, among many other events. Whenever an item is selected, an ActionEvent is fired. Whenever a new item is selected, JComboBox fires ItemEvent twice, once for deselecting the previously selected item, and the other for selecting the currently selected item. Note that no ItemEvent is fired if the current item is reselected. To respond to an ItemEvent, you need to implement the itemStateChanged(ItemEvent e) handler for processing a choice. To get data from a JComboBox menu, you can use getSelectedItem() to return the currently selected item, or e.getItem() method to get the item from the itemStateChanged(ItemEvent e) handler.
Listing 17.8 gives a program that lets users view an image and a description of a country’s flag by selecting the country from a combo box, as shown in Figure 17.22.
Here are the major steps in the program:
1.Create the user interface.
Create a combo box with country names as its selection values. Create a DescriptionPanel object. The DescriptionPanel class was introduced in the preceding
17.8 Combo Boxes 591
Combo box
DescriptionPanel
FIGURE 17.22 A country’s info, including a flag image and a description of the flag, is displayed when the country is selected in the combo box.
example. Place the combo box in the north of the frame and the description panel in the center of the frame.
2.Process the event.
Create a listener to implement the itemStateChanged handler to set the flag title, image, and text in the description panel for the selected country name.
LISTING 17.8 ComboBoxDemo.java
1 import java.awt.*;
2 import java.awt.event.*;
3 import javax.swing.*;
4
5 public class ComboBoxDemo extends JFrame {
6// Declare an array of Strings for flag titles
7 private String[] flagTitles = {"Canada", "China", "Denmark", 8 "France", "Germany", "India", "Norway", "United Kingdom", 9 "United States of America"};
10
11// Declare an ImageIcon array for the national flags of 9 countries
12private ImageIcon[] flagImage = {
13new ImageIcon("image/ca.gif"),
14new ImageIcon("image/china.gif"),
15new ImageIcon("image/denmark.gif"),
16new ImageIcon("image/fr.gif"),
17new ImageIcon("image/germany.gif"),
18new ImageIcon("image/india.gif"),
19new ImageIcon("image/norway.gif"),
20new ImageIcon("image/uk.gif"),
21new ImageIcon("image/us.gif")
22};
23
24// Declare an array of strings for flag descriptions
25private String[] flagDescription = new String[9];
27// Declare and create a description panel
28private DescriptionPanel descriptionPanel = new DescriptionPanel();
30// Create a combo box for selecting countries
31 private JComboBox jcbo = new JComboBox(flagTitles);
32
33public static void main(String[] args) {
34ComboBoxDemo frame = new ComboBoxDemo();
country
image icon
description
combo box
592 Chapter 17 |
Creating Graphical User Interfaces |
|
|
35 |
frame.pack(); |
|
36 |
frame.setTitle("ComboBoxDemo"); |
|
37 |
frame.setLocationRelativeTo(null); // Center the frame |
|
38 |
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); |
|
39 |
frame.setVisible(true); |
|
40 |
} |
|
41 |
|
|
42 |
public ComboBoxDemo() { |
|
43 |
// Set text description |
|
44 |
flagDescription[0] = "The Maple Leaf flag \n\n" + |
|
45 |
"The Canadian National Flag was adopted by the Canadian " + |
|
46 |
"Parliament on October 22, 1964 and was proclaimed into law " + |
|
47 |
"by Her Majesty Queen Elizabeth II (the Queen of Canada) on " + |
|
48 |
"February 15, 1965. The Canadian Flag (colloquially known " + |
|
49 |
"as The Maple Leaf Flag) is a red flag of the proportions " + |
|
50 |
"two by length and one by width, containing in its center a " + |
|
51 |
"white square, with a single red stylized eleven-point " + |
|
52 |
"maple leaf centered in the white square."; |
|
53 |
flagDescription[1] = "Description for China ... "; |
|
54 |
flagDescription[2] = "Description for Denmark ... "; |
|
55 |
flagDescription[3] = "Description for France ... "; |
|
56 |
flagDescription[4] = "Description for Germany ... "; |
|
57 |
flagDescription[5] = "Description for India ... "; |
|
58 |
flagDescription[6] = "Description for Norway ... "; |
|
59 |
flagDescription[7] = "Description for UK ... "; |
|
60 |
flagDescription[8] = "Description for US ... "; |
|
61 |
|
|
62 |
// Set the first country (Canada) for display |
|
63 |
setDisplay(0); |
|
64 |
|
|
65 |
// Add combo box and description panel to the list |
create UI |
66 |
add(jcbo, BorderLayout.NORTH); |
|
67 |
add(descriptionPanel, BorderLayout.CENTER); |
|
68 |
|
|
69 |
// Register listener |
listener |
70 |
jcbo.addItemListener(new ItemListener() { |
|
71 |
/** Handle item selection */ |
|
72 |
public void itemStateChanged(ItemEvent e) { |
|
73 |
setDisplay(jcbo.getSelectedIndex()); |
|
74 |
} |
|
75 |
}); |
|
76 |
} |
|
77 |
|
|
78 |
/** Set display information on the description panel */ |
|
79 |
public void setDisplay(int index) { |
|
80 |
descriptionPanel.setTitle(flagTitles[index]); |
|
81 |
descriptionPanel.setImageIcon(flagImage[index]); |
|
82 |
descriptionPanel.setDescription(flagDescription[index]); |
|
83 |
} |
|
84 |
} |
The listener listens to ItemEvent from the combo box and implements ItemListener (lines 70–75). Instead of using ItemEvent, you may rewrite the program to use ActionEvent for handling combo-box item selection.
The program stores the flag information in three arrays: flagTitles, flagImage, and flagDescription (lines 7–25). The array flagTitles contains the names of nine countries, the array flagImage contains images of the nine countries’ flags, and the array flagDescription contains descriptions of the flags.
17.9 Lists 593
The program creates an instance of DescriptionPanel (line 28), which was presented in Listing 17.6, DescriptionPanel.java. The program creates a combo box with initial values from flagTitles (line 31). When the user selects an item in the combo box, the itemStateChanged handler is executed, finds the selected index, and sets its corresponding flag title, flag image, and flag description on the panel.
17.9 Lists
A list is a component that basically performs the same function as a combo box but enables the user to choose a single value or multiple values. The Swing JList is very versatile. Figure 17.23 lists several frequently used constructors and methods in JList.
javax.swing.JComponent
The get and set methods for these data fields are provided in the class, but omitted in the UML diagram for brevity.
javax.swing.JList
-selectedIndex: int -selectedIndices: int[] -selectedValue: Object -visibleRowCount: int
-selectionBackground: Color -selectionForeground: Color -selectionMode: int
+JList()
+JList(items: Object[])
+addListSelectionListener(listener: ListSelectionListener): void
FIGURE 17.23 JList enables you to select multiple items from a set of items.
selectionMode is one of the three values (SINGLE_SELECTION, SINGLE_INTERVAL _SELECTION, MULTIPLE_INTERVAL_SELECTION) defined in javax.swing.ListSelectionModel that indicate whether a single item, single-interval item, or multiple-interval item can be selected. Single selection allows only one item to be selected. Single-interval selection allows multiple selections, but the selected items must be contiguous. Multipleinterval selection allows selections of multiple contiguous items without restrictions, as shown in Figure 17.24. The default value is MULTIPLE_INTERVAL_SELECTION.
(a) Single selection |
(b) Single-interval |
(c) Multiple-interval |
|
selection |
selection |
FIGURE 17.24 JList has three selection modes: single selection, single-interval selection, and multiple-interval selection.
594 Chapter 17 Creating Graphical User Interfaces
JList inside a scroll
pane
The following statements create a list with six items, red foreground, white background, pink selection foreground, black selection background, and visible row count 4.
JList jlst = new JList(new Object[]
{"Item 1", "Item 2", "Item 3", "Item 4", "Item 5", "Item 6"}); jlst.setForeground(Color.RED);
jlst.setBackground(Color.WHITE);
jlst.setSelectionForeground(Color.PINK);
jlst.setSelectionBackground(Color.BLACK); jlst.setVisibleRowCount(4);
Lists do not scroll automatically. To make a list scrollable, create a scroll pane and add the list to it.
JList fires javax.swing.event.ListSelectionEvent to notify the listeners of the selections. The listener must implement the valueChanged handler in the javax.swing.event.ListSelectionListener interface to process the event.
Listing 17.9 gives a program that lets users select countries in a list and display the flags of the selected countries in the labels. Figure 17.25 shows a sample run of the program.
JPanel with
GridLayout
An image is displayed on a
Jlabel
FIGURE 17.25 When the countries in the list are selected, corresponding images of their flags are displayed in the labels.
Here are the major steps in the program:
1.Create the user interface.
Create a list with nine country names as selection values, and place the list inside a scroll pane. Place the scroll pane in the west of the frame. Create nine labels to be used to display the countries’ flag images. Place the labels in the panel, and place the panel in the center of the frame.
2.Process the event.
Create a listener to implement the valueChanged method in the ListSelectionListener interface to set the selected countries’ flag images in the labels.
LISTING 17.9 ListDemo.java
1 import java.awt.*;
2 import javax.swing.*;
3 import javax.swing.event.*;
4
5 public class ListDemo extends JFrame { 6 final int NUMBER_OF_FLAGS = 9;
7
8// Declare an array of Strings for flag titles
9private String[] flagTitles = {"Canada", "China", "Denmark",
17.9 Lists 595
10"France", "Germany", "India", "Norway", "United Kingdom",
11"United States of America"};
12
13// The list for selecting countries
14private JList jlst = new JList(flagTitles);
15
16// Declare an ImageIcon array for the national flags of 9 countries
17private ImageIcon[] imageIcons = {
18new ImageIcon("image/ca.gif"),
19new ImageIcon("image/china.gif"),
20new ImageIcon("image/denmark.gif"),
21new ImageIcon("image/fr.gif"),
22new ImageIcon("image/germany.gif"),
23new ImageIcon("image/india.gif"),
24new ImageIcon("image/norway.gif"),
25new ImageIcon("image/uk.gif"),
26new ImageIcon("image/us.gif")
27};
28
29// Arrays of labels for displaying images
30private JLabel[] jlblImageViewer = new JLabel[NUMBER_OF_FLAGS];
32public static void main(String[] args) {
33 |
ListDemo frame = new ListDemo(); |
create frame |
34frame.setSize(650, 500);
35frame.setTitle("ListDemo");
36frame.setLocationRelativeTo(null); // Center the frame
37frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
38frame.setVisible(true);
39}
40
41public ListDemo() {
42// Create a panel to hold nine labels
43 |
JPanel p = new JPanel(new GridLayout(3, 3, 5, 5)); |
create UI |
44 |
|
|
45for (int i = 0; i < NUMBER_OF_FLAGS; i++) {
46p.add(jlblImageViewer[i] = new JLabel());
47jlblImageViewer[i].setHorizontalAlignment
48(SwingConstants.CENTER);
49}
50
51// Add p and the list to the frame
52add(p, BorderLayout.CENTER);
53add(new JScrollPane(jlst), BorderLayout.WEST);
55// Register listeners
56jlst.addListSelectionListener(new ListSelectionListener() {
57/** Handle list selection */
58 |
public void valueChanged(ListSelectionEvent e) { |
event handler |
59// Get selected indices
60int[] indices = jlst.getSelectedIndices();
62int i;
63// Set icons in the labels
64for (i = 0; i < indices.length; i++) {
65jlblImageViewer[i].setIcon(imageIcons[indices[i]]);
66}
67
68// Remove icons from the rest of the labels
69for (; i < NUMBER_OF_FLAGS; i++) {