- •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
572 Chapter 17 Creating Graphical User Interfaces
|
17.1 Introduction |
GUI |
A graphical user interface (GUI) makes a system user friendly and easy to use. Creating a |
|
GUI requires creativity and knowledge of how GUI components work. Since the GUI compo- |
|
nents in Java are very flexible and versatile, you can create a wide assortment of useful user |
|
interfaces. |
|
Many Java IDEs provide tools for visually designing and developing GUI interfaces. This |
|
enables you to rapidly assemble the elements of a user interface (UI) for a Java application or |
|
applet with minimum coding. Tools, however, cannot do everything. You have to modify the |
|
programs they produce. Consequently, before you begin to use the visual tools, you must |
|
understand the basic concepts of Java GUI programming. |
|
Previous chapters briefly introduced several GUI components. This chapter introduces the |
|
frequently used GUI components in detail (see Figure 17.1). (Since this chapter introduces no |
|
new concepts, instructors may assign it for students to study on their own.) |
|
|
|
JButton |
|
Component |
Container |
JComponent |
AbstractButton |
JCheckBox |
|
|
|
JToggleButton |
|
|
|
|
JLabel |
JRadioButton |
|
|
|
|
|
|
|
|
JTextArea |
|
|
|
|
JTextComponent |
|
|
|
|
JTextField |
JPasswordField |
|
|
|
JComboBox |
|
|
|
|
JList |
|
|
|
|
JScrollBar |
|
|
|
|
JSlider |
|
FIGURE 17.1 These Swing GUI components are frequently used to create user interfaces.
|
Note |
|
Throughout this book, the prefixes jbt, jchk, jrb, jlbl, jtf, jpf, jta, jcbo, jlst, |
naming convention for |
jscb, and jsld are used to name reference variables for JButton, JCheckBox, |
components |
JRadioButton, JLabel, JTextField, JPasswordField, JTextArea, JComboBox, |
|
JList, JScrollBar, and JSlider. |
|
17.2 Buttons |
|
A button is a component that triggers an action event when clicked. Swing provides regular |
|
buttons, toggle buttons, check box buttons, and radio buttons. The common features of these |
AbstractButton |
buttons are defined in javax.swing. AbstractButton, as shown in Figure 17.2. |
JButton |
This section introduces the regular buttons defined in the JButton class. JButton inherits |
|
AbstractButton and provides several constructors to create buttons, as shown in Figure 17.3. |
|
17.2.1 Icons, Pressed Icons, and Rollover Icons |
A regular button has a default icon, a pressed icon, and a rollover icon. Normally you use the default icon. The other icons are for special effects. A pressed icon is displayed when a button is pressed, and a rollover icon is displayed when the mouse is over the button but not pressed.
17.2 Buttons 573
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.AbstractButton
-actionCommand: String -text: String
-icon: javax.swing.Icon
-pressedIcon: javax.swing.Icon -rolloverIcon: javax.swing.Icon -mnemonic: int
-horizontalAlignment: int -horizontalTextPosition: int -verticalAlignment: int -verticalTextPosition: int -borderPainted: boolean
-iconTextGap: int -selected(): boolean
FIGURE 17.2 AbstractButton defines common features of different types of buttons.
javax.swing.AbstractButton
javax.swing.JButton
+JButton()
+JButton(icon: javax.swing.Icon) +JButton(text: String) +JButton(text: String, icon: Icon)
+addActionListener(listener: ActionListener) : void
FIGURE 17.3 JButton defines a regular push button.
For example, Listing 17.1 displays the American flag as a regular icon, the Canadian flag as a pressed icon, and the British flag as a rollover icon, as shown in Figure 17.4.
LISTING 17.1 TestButtonIcons.java
1 |
import |
javax.swing.*; |
|
2 |
public |
class TestButtonIcons extends JFrame { |
|
3 |
|||
4 |
public static |
void main(String[] args) { |
|
5 |
// |
Create a |
frame and set its properties |
6JFrame frame = new TestButtonIcons();
7 frame.setTitle("ButtonIcons");
8frame.setSize(200, 100);
9 frame.setLocationRelativeTo(null); // Center the frame
10 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
574 Chapter 17 |
Creating Graphical User Interfaces |
||||||
|
11 |
|
frame.setVisible(true); |
||||
|
12 |
} |
|
|
|
|
|
|
13 |
public TestButtonIcons() { |
|||||
|
14 |
||||||
create icons |
15 |
|
ImageIcon usIcon = new ImageIcon("image/usIcon.gif"); |
||||
|
16 |
|
ImageIcon caIcon = new ImageIcon("image/caIcon.gif"); |
||||
|
17 |
|
ImageIcon ukIcon = new ImageIcon("image/ukIcon.gif"); |
||||
|
18 |
|
JButton jbt = new JButton("Click it", |
|
|
||
regular icon |
19 |
|
usIcon); |
|
|||
pressed icon |
20 |
|
jbt.setPressedIcon(caIcon); |
|
|
||
rollover icon |
21 |
|
jbt.setRolloverIcon(ukIcon); |
|
|
|
|
|
22 |
|
|
|
|
|
|
add a button |
23 |
} |
add(jbt); |
||||
|
24 |
|
|
|
|
|
|
|
25 |
} |
|
|
|
|
|
(a) Default icon |
(b) Pressed icon |
(c) Rollover icon |
FIGURE 17.4 A button can have several types of icons.
|
17.2.2 Alignments |
horizontal alignment |
Horizontal alignment specifies how the icon and text are placed horizontally on a button. |
|
You can set the horizontal alignment using setHorizontalAlignment(int) with one of |
|
the five constants LEADING, LEFT, CENTER, RIGHT, TRAILING, as shown in Figure 17.5. At |
|
present, LEADING and LEFT are the same, and TRAILING and RIGHT are the same. Future |
|
implementation may distinguish them. The default horizontal alignment is SwingCon- |
|
stants.CENTER. |
Horizontally left |
Horizontally center |
Horizontally right |
FIGURE 17.5 You can specify how the icon and text are placed on a button horizontally.
vertical alignment |
Vertical alignment specifies how the icon and text are placed vertically on a button. You |
|
can set the vertical alignment using setVerticalAlignment(int) with one of the three |
|
constants TOP, CENTER, BOTTOM, as shown in Figure 17.6. The default vertical alignment is |
|
SwingConstants.CENTER. |
Vertically top |
Vertically center |
Vertically bottom |
FIGURE 17.6 You can specify how the icon and text are placed on a button vertically.
17.2 Buttons 575
17.2.3Text Positions
Horizontal text position specifies the horizontal position of the text relative to the icon. You can horizontal text position set the horizontal text position using setHorizontalTextPosition(int) with one of the
five constants LEADING, LEFT, CENTER, RIGHT, TRAILING, as shown in Figure 17.7. At present, LEADING and LEFT are the same, and TRAILING and RIGHT are the same. Future implementation may distinguish them. The default horizontal text position is SwingConstants.RIGHT.
Text positioned left |
Text positioned center |
Text positioned right |
FIGURE 17.7 You can specify the horizontal position of the text relative to the icon.
Vertical text position specifies the vertical position of the text relative to the icon. You can vertical text position set the vertical text position using setVerticalTextPosition(int) with one of the three
constants TOP, CENTER, BOTTOM, as shown in Figure 17.8. The default vertical text position is
SwingConstants.CENTER.
Text positioned top |
Text positioned |
Text positioned bottom |
|
vertically center |
|
FIGURE 17.8 You can specify the vertical position of the text relative to the icon.
Note
The constants LEFT, CENTER, RIGHT, LEADING, TRAILING, TOP, and BOTTOM used in
AbstractButton are also used in many other Swing components. These constants are centrally defined in the javax.swing.SwingConstants interface. Since all Swing GUI components
implement SwingConstants, you can reference the constants through SwingConstants or a SwingConstants GUI component. For example, SwingConstants.CENTER is the same as JButton.CENTER.
JButton can fire many types of events, but often you need to add listeners to respond to an ActionEvent. When a button is pressed, it fires an ActionEvent.
17.2.4Using Buttons
This section presents a program, shown in Listing 17.2, that displays a message on a panel and uses two buttons, <= and =>, to move the message on the panel to the left or right. The layout of the UI is shown in Figure 17.9.
Here are the major steps in the program:
1.Create the user interface.
Create a MessagePanel object to display the message. The MessagePanel class was created in Listing 15.8, MessagePanel.java. Place it in the center of the frame. Create two buttons, <= and =>, on a panel. Place the panel in the south of the frame.
Video Note
Use buttons
576Chapter 17 Creating Graphical User Interfaces
2.Process the event.
Create and register listeners for processing the action event to move the message left or right according to whether the left or right button was clicked.
MessagePanel
JPanel with
FlowLayout
FIGURE 17.9 Clicking the <= and => buttons causes the message on the panel to move to the left and right, respectively.
LISTING 17.2 ButtonDemo.java
|
1 |
import java.awt.*; |
|
||||||||
|
2 |
import java.awt.event.ActionListener; |
|
||||||||
|
3 |
import java.awt.event.ActionEvent; |
|
|
|||||||
|
|
JFrame |
|||||||||
|
4 |
import javax.swing.*; |
|
|
|||||||
|
5 |
|
|
|
|
|
|
|
|
|
|
|
6 |
public class ButtonDemo extends JFrame { |
|
ButtonDemo |
|||||||
|
7 |
|
// Create a panel for displaying message |
|
|
||||||
|
8 |
|
protected MessagePanel messagePanel |
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|
9 |
|
|
= new MessagePanel("Welcome to Java"); |
|
|
|
||||
|
10 |
|
|
|
|
|
|
|
|
|
|
|
11 |
|
// Declare two buttons to move the message left and right |
||||||||
|
12 |
|
private JButton jbtLeft = new JButton("<="); |
|
|
|
|||||
|
13 |
|
private JButton jbtRight = new JButton("=>"); |
|
|
|
|||||
|
14 |
|
|
|
|
|
|
|
|
|
|
|
15 |
|
public static void main(String[] args) { |
|
|||||||
create frame |
16 |
|
|
ButtonDemo frame = new ButtonDemo(); |
|
||||||
|
17 |
|
|
frame.setTitle("ButtonDemo"); |
|
||||||
|
18 |
|
|
frame.setSize(250, 100); |
|
||||||
|
19 |
|
|
frame.setLocationRelativeTo(null); // Center the frame |
|||||||
|
20 |
|
|
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); |
|
||||||
|
21 |
|
|
frame.setVisible(true); |
|
||||||
|
22 |
|
} |
|
|
|
|
|
|
|
|
|
23 |
|
|
|
|
|
|
|
|
|
|
|
24 |
|
public ButtonDemo() { |
|
|||||||
create UI |
25 |
|
|
// Set the background color of messagePanel |
|
||||||
|
26 |
|
|
messagePanel.setBackground(Color.white); |
|
||||||
|
27 |
|
|
|
|
|
|
|
|
|
|
|
28 |
|
|
// Create Panel jpButtons to hold two Buttons "<=” and “right =>" |
|||||||
|
29 |
|
|
JPanel jpButtons = new JPanel(); |
|
||||||
|
30 |
|
|
jpButtons.add(jbtLeft); |
|
||||||
|
31 |
|
|
jpButtons.add(jbtRight); |
|
||||||
|
32 |
|
|
|
|
|
|
|
|
|
|
|
33 |
|
|
// Set keyboard mnemonics |
|
||||||
mnemonic |
34 |
|
|
jbtLeft.setMnemonic('L'); |
|
|
|
|
|
|
|
|
35 |
|
|
jbtRight.setMnemonic('R'); |
|
||||||
|
36 |
|
|
|
|
|
|
|
|
|
|
|
37 |
|
|
// Set icons and remove text |
|
||||||
|
38 |
// |
|
jbtLeft.setIcon(new ImageIcon("image/left.gif")); |
|
||||||
|
39 |
// |
|
jbtRight.setIcon(new ImageIcon("image/right.gif")); |
|
||||||
|
40 |
// |
|
jbtLeft.setText(null); |
|
|
|
|
|
17.2 Buttons 577 |
41 |
// |
jbtRight.setText(null); |
|
|
42 |
|
|
|
|
43 |
|
// Set tool tip text on the buttons |
|
|
44 |
|
jbtLeft.setToolTipText("Move message to left"); |
|
tool tip |
45 |
|
jbtRight.setToolTipText("Move message to right"); |
|
|
46 |
|
|
|
|
47// Place panels in the frame
48setLayout(new BorderLayout());
49add(messagePanel, BorderLayout.CENTER);
50add(jpButtons, BorderLayout.SOUTH);
51 |
|
|
52 |
// Register listeners with the buttons |
|
53 |
jbtLeft.addActionListener(new ActionListener() { |
register listener |
54public void actionPerformed(ActionEvent e) {
55messagePanel.moveLeft();
56}
57});
58 |
jbtRight.addActionListener(new ActionListener() { |
register listener |
59public void actionPerformed(ActionEvent e) {
60messagePanel.moveRight();
61}
62});
63}
64}
messagePanel (line 8) is deliberately declared protected so that it can be referenced by a subclass in future examples.
You can set an icon image on the button by using the setIcon method. If you uncomment the following code in lines 38–41:
//jbtLeft.setIcon(new ImageIcon("image/left.gif"));
//jbtRight.setIcon(new ImageIcon("image/right.gif"));
//jbtLeft.setText(null);
//jbtRight.setText(null);
the texts are replaced by the icons, as shown in Figure 17.10(a). "image/left.gif" is located in "c:\book\image\left.gif". Note that the backslash is the Windows file-path notation. In Java, the forward slash should be used.
(a) |
(b) |
(c) |
FIGURE 17.10 You can set an icon on a JButton and access a button using its mnemonic key.
You can set text and an icon on a button at the same time, if you wish, as shown in Figure 17.10(b). By default, the text and icon are centered horizontally and vertically.
The button can also be accessed by using the keyboard mnemonics. Pressing Alt+ L is equivalent to clicking the <= button, since you set the mnemonic property to 'L' in the left button (line 34). If you change the left button text to "Left" and the right button text to "Right", the L and R in the captions of these buttons will be underlined, as shown in Figure 17.10(b).