1. Trang chủ
  2. » Công Nghệ Thông Tin

Java All-in-One Desk Reference For Dummies phần 7 doc

89 152 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 89
Dung lượng 1,55 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

void setToolTipText Sets the tooltip text that’s displayed if the user rests the String text mouse over an empty part of the panel.. void setToolTipText Sets the tooltip text that’s disp

Trang 2

Some Important Swing Concepts You Need to Know 508

The Swing class hierarchyThe Swing API provides many different classes for creating various types ofuser interface elements In this chapter, I look at three of those classes:JFrame, JPanel, and JLabel However, these three classes are part of alarger collection of classes that are all related through inheritance, as shown

in Figure 1-2 The Swing family tree splits at the Componentclass into onegroup of classes that are derived from the JComponentclass, and anotherbranch that descends from the Windowclass

Figure 1-2:

The Swingfamily tree

Figure 1-1:

A typicalSwingwindow

Trang 3

Book VI Chapter 1

Some Important Swing Concepts You Need to Know 509

The following paragraphs briefly describe each of the classes shown in thisfigure:

Object : All classes ultimately derive from Object, so it’s no surprisethat this class is at the top of the tree

Component : The Componentclass represents an object that has avisual representation that can be shown on-screen and that can interactwith users This class defines some basic methods that are available toall Swing classes For example, the setVisiblemethod determineswhether a component is visible or hidden And the setBoundsmethodsets the location and size of the component This is an AWT class, not aSwing class

Container : The Containerclass builds on the basic visual capabilities

of the Componentclass by adding the ability to hold other containers

This too is an AWT class rather than a Swing class From this class, youget the addmethod, which lets you add components to a container Asyou’ll see, you use this method in almost all GUI programs

Window : This class defines a window, which is a specialized type of

container object that has a border, a title bar, buttons that minimize,maximize, and close the window, and that can be repositioned and possibly even resized by the user

Frame: A frame is a type of Windowthat serves as the basis for Java GUIapplications Frameis an AWT class that has been improved upon bythe JFrameclass

JFrame : The Swing version of the older Frameclass Most of yourSwing applications include at least one JFrameobject

JComponent : The JComponentclass is a Swing class that is the basisfor all other Swing components except for frames

JPanel: This class creates panels, which are containers used to

organ-ize and control the layout of other components such as labels, buttons,text fields, and so on In most Swing applications, one or more panels areadded to a frame Then, when the frame is displayed, the componentsthat were added to its panels are made visible

JLabel : This class creates a label that displays a simple text value.

As you work with Swing, you’ll find that some of the classes you use aredefined in the javax.swingpackage So you need to start every Swingapplication with this line:

import javax.swing.*;

In addition, you’ll find that some Swing features use classes in the java.awtand java.awt.eventpackages So you may need to import those packages

as well

Trang 4

I’ve Been Framed!

510

I’ve Been Framed!

The top-level component for most Swing-based applications is called a frame

and is defined by the JFrameclass By itself, a frame doesn’t do much But

to do anything else in Swing, you must first create a frame Figure 1-3 shows

a frame that does nothing but display the message Hello, World!in itstitle bar

The JFramehas about a bazillion methods, but only a few of them areuseful in most programs Table 1-1 lists the JFramemethods you use most,along with a couple of constructors

Table 1-1 Useful JFrame Constructors and Methods

JFrame() Creates a new frame with no title

JFrame(String title) Creates a new frame with the specified title

void add(Component c) Adds the specified component to the frame.JMenuBar getJMenuBar() Gets the menu for this frame

void pack() Adjusts the size of the frame to fit the

compo-nents you’ve added to it

void remove(Component c) Removes the specified component from the

frame

void Sets the action taken when the user closes the setDefaultCloseOperation frame You should almost always specify

JFrame.EXIT_ON_CLOSE.void setIconImage Sets the icon displayed when the frame is

void setLayout Sets the layout manager used to control how (LayoutManager layout) components are arranged when the frame is dis-

played The default is the BorderLayout manager.void setLocation Sets the xand yposition of the frame on-screen (int x, int y) The top-left corner of the screen is 0, 0

Figure 1-3:

The framedisplayed bythe Hello,World!

program

Trang 5

Book VI Chapter 1

(the frame can be resized)

void setSize(int width, Sets the size of the frame to the specified width

void setJMenuBar(JMenuBar Sets the menu for this frame

menu)

At the minimum, you want to set a title for a new frame, set the frame’s size

so it’s large enough to see any components you add to it (by default, theframe is zero pixels wide and zero pixels high, so it isn’t very useful), andcall the setVisiblemethod to make the frame visible One way to dothese three things is to create an instance of the JFrameclass and set itsproperties using statements like this:

JFrame frame = new JFrame(“This is the title”);

frame.setSize(350, 260);

frame.setVisible(true);

However, creating a frame by declaring a class that extends the JFrameclass is more common Then, you call these methods in the constructor,

as I describe in the next section

By default, the user can change the size of a frame If you want to fix the size

of your frame so the user can’t change it, just call setResizeable(false)

Hello, World! in Swing

To get you started with Swing, Listing 1-1 shows a Swing version of the sic Hello, World! program, using nothing but a frame If you run this program,the frame shown in Figure 1-1 is displayed on-screen As you can see, theframe’s title bar contains the text “Hello, World!”

clas-The purpose of this seemingly pointless little program is to illustrate onesolution to the first problem you encounter when you work with Swing: Themainmethod is a static method, but Swing frames are objects So, you have

to figure out how to get your program out of a static context This programdoes that by creating the application as a class that extends JFrame Then,the mainmethod calls the class constructor, in effect creating an instance ofitself That’s all the mainmethod does; the real work of this application isdone by the constructor

Trang 6

Hello, World! in Swing 512

L ISTING 1-1: T HE S WING V ERSION OF THE H ELLO , W ORLD ! P ROGRAM

this.setTitle(“Hello World!”);15

} }

The following paragraphs describe most of the features of this program:

1 The program starts with an importstatement that imports all theclasses in the javax.swingpackage Most of the Swing classes aredefined in this package However, you may have to import otherclasses as well, depending on what GUI features your program uses

3 The class for this application, named JFrame, extends a Swing classnamed JFrame A class that extends JFrameis often called a frame class The JFrameclass defines a basic frame in which you can displayGUI components, such as labels and text boxes All Swing applicationsneed at least one class that extends JFrame

5 Swing applications are still Java applications, and all Java

applica-tions need a static mainmethod that starts the application So thefirst method listed in this class is the mainmethod

7 The first (and only) statement of the mainmethod creates a newinstance of the HelloFrameclass Unlike console applications,Swing applications can’t run in a static context As a result, the mainpurpose of the static mainmethod in a Swing application is to create

an instance of the application’s frame class

10 When an instance of the HelloFrameclass is created in line 7, theconstructor that starts on this line is executed The main job of theconstructor for a frame class is to set the options for the frame andcreate any GUI components that are displayed in the frame

12 The first option that this constructor sets is the size of the frame To

do that, it calls the setSizemethod The parameters specify that

Trang 7

Book VI Chapter 1

Positioning the Frame On-Screen 513

the frame should be 200 pixels wide and 100 pixels high (A pixel is

one of the little dots that makes up the image on a computer screen

Pixel is short for picture element, but that won’t be on the test.)

13 The next option this constructor sets is what to do if the user closes

the frame by clicking its Close button, which usually appears in theupper-right hand corner of the frame By default, clicking the Closebutton hides the frame but doesn’t terminate the application As aresult, the application’s main thread (the one that’s still running in

a static context via the mainmethod) keeps running for a while

Eventually, Java figures out that nothing’s happening and shuts theapplication down But the application exits more cleanly if you usethe setDefaultCloseOperationto set the close operation toJFrame.EXIT_ON_CLOSE That causes the program to terminatewhen the frame is closed

15 The next statement uses the setTitlemethod to set the title of theframe

16 The last statement in the constructor calls the setVisiblemethodwith a parameter value of true, which makes the frame visible on-screen If you leave this statement out, the frame is created but theuser never sees it

That’s all there is to this program Granted, it’s a little more complicatedthan the console-base Hello, World! program from Book I, Chapter 1 But not

by much Just to be sure its operation is clear, here’s a recap of what pens when this program is run:

hap-1.Java runs the static mainmethod for the HelloWorldclass

2.The mainmethod creates an instance of the HelloWorldclass, whichcauses the constructor to be executed

3.The constructor sets the frame size, the default close operation, and thetitle

4.Now that the constructor is done, the program continues with the mainmethod, where the setVisiblemethod is called to display the frame

Positioning the Frame On-Screen

The JFrameclass provides two methods that let you specify the position ofthe frame on-screen If you want to place the frame at some arbitrary locationon-screen, use the setLocationmethod For example, to put the frame atthe top left corner of the screen, use this statement:

frame.setLocation(0,0);

Trang 8

Using the JPanel Class 514

If you want to center the frame on-screen, call the setLocationRelativeTomethod and pass nullas the parameter:

frame.setLocationRelativeTo(null);

This method is designed to let you position a frame relative to some othercomponent that’s already displayed But if you pass nullas the parameter,the method centers the frame on-screen

If you want to position a window at some location other than the top leftcorner or dead center on-screen, you may need to know the width andheight of the user’s screen so you can calculate a location for your frame

To determine the size of the user’s screen, you can use a class namedToolkit The Toolkitclass has a bunch of methods, but you need toknow two of them here:

getDefaultToolkit : A static method that creates a Toolkitobject.You must use this method before you can use the getScreenSizemethod

getScreenSize : Returns the size of the screen as a Dimensionobject The Dimensionclass has two public fields that represent thesize of the screen: heightand width Both fields are of type int.Suppose you want to position a frame so that its bottom-left corner is right atthe center of the screen The following code placed in the frame’s constructordoes the trick:

the bottom of the frame at the vertical midpoint.

Using the JPanel Class

A panel is a type of container that’s designed to hold a group of components

so they can be displayed on a frame The normal way to display a group ofcontrols such as text fields, labels, buttons, and other GUI widgets is to addthose controls to a panel, and then add the panel to the frame You can bypassthe panel and add the controls directly to the frame if you want, but using aseparate panel to hold the frames control is almost always a good idea

Trang 9

Book VI Chapter 1

Using the JPanel Class 515

Panels are defined by the JPanelclass Like the JFrameclass, the JPanelclass has a bevy of methods Table 1-2 lists the most commonly used con-structors and methods for the JPanelclass

Table 1-2 Interesting JPanel Constructors and Methods

Constructor DescriptionJPanel() Creates a new panel

JPanel(boolean Creates a new panel If the parameter is true, the panel isDoubleBuffered) uses a technique called double-buffering, which results in

better display for graphics applications This constructor

is usually used for game programs or other panels thatdisplay animations

JPanel(LayoutManager Creates a new panel with the specified layout manager

layout) The default layout manager is FlowLayout

void add(Component c) Adds the specified component to the panel

void remove Removes the specified component from the panel

(Component c)void setLayout Sets the layout manager used to control how components (LayoutManager are arranged when the panel is displayed The default is layout) the FlowLayout manager

void setLocation(int Sets the xand yposition of the frame-screen The top-left

x, int y) corner of the screen is 0, 0

void setSize(int Sets the size of the frame to the specified width and width, int height) height

void setToolTipText Sets the tooltip text that’s displayed if the user rests the (String text) mouse over an empty part of the panel

You can use several different techniques to create a panel and add it to aframe One is to simply create a JPanelobject and assign it to a variable inthe JFrameconstructor You can then add components to the panel, andthen add the panel to the frame For example

// HelloFrame constructorpublic HelloFrame()

{this.setSize(200,100);

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

this.setTitle(“Hello, World!”);

JPanel panel = new JPanel();

// code to add components to the panel goes here this.setVisible(true);

}

Trang 10

Using Labels 516

Another commonly used technique is to create a separate class for the panel.This class should extend JPanel Then, you can add any components thepanel needs in the constructor:

class HelloPanel extends JPanel{

public HelloPanel(){

// code to add components to the panel goes here}

}Then, in the frame class constructor, you create a new instance of the panelclass and add it to the panel:

HelloPanel panel = new HelloPanel();

A label can also display an image, or it can display both an image and sometext And you have complete control over the appearance of the text: Youcan specify the font, size, whether the text is bold, italic, or underlined, whatcolor the text is displayed as, and so on In this chapter, I discuss how towork with basic labels For more information about additional things youcan do with labels, see Book IX, Chapters 1 and 2

To create a label, you use the JLabelclass Table 1-3 shows its most monly used constructors and methods

com-Table 1-3 Tolerable JLabel Constructors and Methods

Constructor DescriptionJLabel() Creates a new label with no initial text

JLabel(String text) Creates a new label with the specified text

Trang 11

Book VI Chapter 1

Using Labels 517

String getText() Returns the text displayed by the label

void setText(String Sets the text displayed by the label

text)void setToolTipText Sets the tooltip text that’s displayed if the user rests the (String text) mouse over the label for a few moments

void setVisible Shows or hides the label

(boolean value)

When you create a label, you can pass the text you want it to display to theconstructor, like this:

JLabel label1 = new JLabel(“Hello, World!”);

Or, you can create the label first, and then set its text later:

JLabel label1 = new JLabel();

label1.setText(“Hello, World!”);

A label won’t be displayed until you add it to a panel that is, in turn, added

to a frame Here’s an example of a constructor for a frame class that creates

a panel, creates a label, adds the label to the panel, and adds the panel tothe frame:

// HelloFrame constructorpublic HelloFrame()

{this.setSize(200,100);

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

this.setTitle(“Hello, World!”);

JPanel panel1 = new JPanel();

JLabel label1 = new JLabel(“Hello, World!”)panel1.add(label1);

Trang 12

Creating Buttons 518

Creating Buttons

Next to labels, the Swing component you use most is the JButtonnent, which creates a button the user can click Figure 1-5 shows a framewith a single button

compo-In the next chapter, you find out how to write the code that responds whenthe user clicks a button Here, I just focus on how to create buttons and con-trol their appearance Table 1-4 lists the most commonly used constructorsand methods that are available for the JButtonclass

Table 1-4 Worthwhile JButton Constructors and Methods

doClick() Triggers an action event for the button as if

the user clicked it (I tell you why this issometimes useful in the next chapter.)String getText() Returns the text displayed by the button.void setBorderPainted Shows or hides the button’s border The (boolean value) default setting is true(the border is

shown)

Figure 1-5:

A framewith apanel,whichincludes

a button

Figure 1-4:

A framewith apanel,which has

a label

Trang 13

Book VI Chapter 1

back-void setEnabled(boolean value) Enables or disables the button The default

setting is true(enabled)

void setRolloverEnabled Enables or disables the rollover effect, (boolean value) which causes the border to get thicker

when the mouse moves over the button

The default setting is true(rollover effectenabled)

void setText(String text) Sets the text displayed by the button

void setToolTipText Sets the tooltip text that’s displayed if the (String text) user lets the mouse rest over the button

void setVisible(boolean Shows or hides the button The default value) setting is true(the button is visible)

As you can see, the constructors of the JButtonclass are similar to theconstructors for the JLabelclass: You can either create an empty button

or a button with text For example, here’s the code that creates the buttonshown in Figure 1-5:

JButton button1 = new JButton(“Click me!”);

If you don’t provide the button text when you call the constructor, you cansupply it later via the setTextmethod, like this:

JButton button1 = new JButton();

button1.setText(“Click me!”);

You might not think you’d ever do that, but sometimes the meaning of abutton changes depending on what the user is doing For example, a pro-gram that lets a user add, change, or delete records in a file might set thetext of a button to Add Record, Change Record, or Delete Recorddepending on what the user happens to be doing at the time In a programlike that, you may need to use the getTextmethod to find out what text iscurrently displayed by a button

Most of the other methods listed in Table 1-4 simply affect how a button looks

To disable a button so the user can’t click it, call setEnabled(false) Toremove the dark border from the edges of a button, call setBorderPainted(false) To remove the background from a button so all that’s displayed

is the text, call setContentAreaFilled(false) And to make a buttondisappear altogether, call setVisible(false)

Trang 14

A Word about the Layout of Components 520

A Word about the Layout of Components

Controlling the layout of components on a panel is one of the hardest thingsabout using Swing Hard enough, in fact, that I devote Book VI, Chapter 5 to

it Until then, you need to know a few key points:

✦ The layout of components on a panel (or frame) is controlled by a layout manager, which determines the final placement of each component The

layout manager takes the size of the component, the size of the panel, andthe position of other nearby components into account when it makes itsdecisions

✦ Swing provides seven different layout managers you can choose from.Each has is own way of deciding where each component goes

✦ The default layout manager for panels is called FlowLayout It placescomponents one after another in a row, and starts a new row only when

it gets to the end of the panel (or the frame that contains it)

✦ With FlowLayout(and with the other layout managers too), the layoutchanges if the user changes the size of the frame The size of the framemakes a big difference in how FlowLayoutarranges controls

✦ You can always call the frame’s setResizeable(false)method toprevent the user from resizing the frame

✦ If you want to change the layout manager used for a panel, you call thepanel’s setLayoutmethod

✦ For many (if not most) Swing applications, you use more than one panel

to display your components Each panel can have a different layout ager With this technique, you can create complex layouts with lots ofcomponents, all arranged just the way you want

man-✦ If you need to, you can always turn off the layout manager altogether

To do that, you call the panel’s setLayoutmethod with nullset

as the parameter Then, you use absolute positioning, which lets you

set the xand yposition and the size of each component by calling itssetBoundsmethod

✦ This list could go on and on For more information about controllinglayout, refer to Book VI, Chapter 5

Trang 15

Chapter 2: Handling Events

In This Chapter

Understanding important event concepts

Working with event handling classes and interfaces

Responding to button clicks

Using inner classes for event handling

Providing an Exit button

Dealing with the Close button

In the previous chapter, you find out how to create Swing frames thatinclude panels, labels, and buttons However, the frames don’t do anything other than sit there They look good, but they’re completely unresponsive Click them all you want, but they don’t do anything

They’re kind of like teenagers

In this chapter, you get those buttons to do something Specifically, you findout how to write code that’s executed when a user clicks a button The tech-

nique you use to do that is called event listening, and it’s one of the most

important aspects of writing Swing programs It may seem a little cated at first, but after you get the swing of it (sorry), event listening makesperfect sense

compli-Although event listening is used mostly to respond to button clicks, it canalso be used to respond to other types of user interactions For example,you can use event listening to write code that’s executed when the usermakes a selection from a combo box, moves the mouse over a label, orpresses a key on the keyboard The event-listening techniques in this chap-ter work for those events as well

Examining Events

An event is an object that’s generated when the user does something

note-worthy with one of your user-interface components For example, if the userclicks a button, drags the mouse over a label, or selects an item from a combobox, an event object is generated This event object is then passed to a spe-

cial method you create called an event listener The event listener can examine

the event object, determine exactly what type of event occurred, and respondaccordingly For example, if the user clicks a button, the event listener might

Trang 16

Examining Events 522

write any data entered by the user via text fields to a file If the user passes themouse over a label, the event handler might change the text displayed by thelabel And if the user selects an item from a combo box, the event handlermight use the value that was selected to look up information in a database.The possibilities are endless!

There are several different types of event objects, represented by variousclasses that all inherit AWTEvent Table 2-1 lists the most commonly used

event classes In addition, this table lists the listener interface that’s used

to create an object that can listen for the event and handle it when it is generated

Note that these event classes are contained in the package java.awt.Strictly speaking, event handling is provided by AWT, not by Swing

Event Class Listener Interface DescriptionActionEvent ActionListener Created when the user performs an

action with a button or other nent Usually, this means that the userhas clicked the button However, theuser can also invoke a button action

compo-by tabbing to the button and pressingthe Enter key

ItemEvent ItemListener Created when the selected item in a

list control, such as a combo box orlist box, is changed

DocumentEvent DocumentListener Created when the user changes the

contents of a text component such as

a text field

WindowEvent WindowListener Created when the status of the

window (frame) changes

KeyEvent KeyListener Created when the user presses a key

on the keyboard This event can beused to watch for specific keystrokesentered by the user

MouseEvent MouseListener Created when the user does

some-thing interesting with the mouse, such

as clicks one of the buttons, drags themouse, or simply moves the mouseover another object

FocusEvent FocusListener Created when a component receives

or loses focus

Trang 17

Book VI Chapter 2

Examining Events 523

The events listed in Table 2-1 can be divided into two categories The firstthree (ActionEvent, ItemEvent, and DocumentEvent) are called

semantic events because they’re related to user interactions that usually

have some specific meaning For example, when the user clicks a button, he

or she is trying to do something specific In contrast, the other events are

called low-level events.

If you’re cramming for the test, you absolutely need to know three importantterms:

✦ Event: An object that’s created when the user does something

notewor-thy with a component, such as clicking it

✦ Event Source: The component that generated the event object Usually,

the event source is a button or other component the user can click, butany Swing component can be an event source

✦ Event Listener: The object that listens for events and handles them

when they occur The event listener object must implement the interfaceappropriate for the event These listener interfaces define the method ormethods that the event source calls when the event occurs Table 2-2lists the methods that are defined by each of the interfaces that arelisted in Table 2-1

Table 2-2 Methods Defined by Event Listener Interfaces

Listener Interface Method DescriptionActionListener void actionPerformed Called when an action event

ItemListener void itemStateChanged Called when the selected

(ItemEvent e) item changes

DocumentListener void changeUpdate Called when text is changed

(DocumentEvent e)void insertUpdate Called when text is inserted

(DocumentEvent e)void removeUpdate Called when text is deleted

DocumentEvent e)WindowListener void windowActivated Called when the window is

Trang 18

Handling Events 524

Table 2-2 (continued)

Listener Interface Method Description

void windowDeiconified Called when the window is (WindowEvent e) changed from icon to normal.void windowIconified Called when the window is (WindowEvent e) minimized to an icon.void windowOpened Called when the window is (WindowEvent e) opened

KeyListener void keyPressed Called when the user

(KeyEvent e) presses a key

void keyReleased Called when the user (KeyEvent e) releases a key

void keyTyped Called when the user types (KeyEvent e) a key

MouseListener void mouseClicked Called when the user clicks

(MouseEvent e) the mouse

void mouseEntered Called when the mouse MouseEvent e) moves over a component.void mouseExited Called when the mouse (MouseEvent e) leaves a component.void mousePressed Called when the user (MouseEvent e) presses the mouse button.void mouseReleased Called when the user (MouseEvent e) releases the mouse button.FocusListener void focusGained Called when the component

(FocusEvent e) gains focus

FocusListener void focusLost Called when the component

(FocusEvent e) looses focus

Handling Events

Now that you know the basic objects that are used for event handling, youhave to actually wire them up to create a program that responds to events

To write Java code that responds to events, you have to do the following:

1.Create a component that can generate events.

You want to add buttons or other components that generate events toyour frame so it displays components the user can interact with (Strictlyspeaking, all Swing components can generate some events Even a labelgenerates a MouseEventwhen the user moves the mouse over it But aframe that consists of nothing but labels isn’t very useful.)

Trang 19

Book VI Chapter 2

Handling Events 525

Usually, you declare the variable that refers to the event source as a vate class field, outside of the constructor for the frame or any othermethod For example

pri-private JButton button1;

Then, in the constructor for the frame class, you can create the button

For example, here’s code that creates a panel, creates a button, adds it

to a panel, and then adds the panel to the frame:

JPanel panel = new JPanel();

button1 = new JButton(“Click me!”);

public class ClickMeextends JFrame implements ActionListenerLater in this chapter, I tell you about other ways to implement the eventlistener interface

3.Write the code for any methods defined by the listener.

When you implement a listener interface, you must provide an tation of each method defined by the interface Most listener interfacesdefine just one method, corresponding to the type of event the interfacelistens for For example, the ActionListenerinterface defines a methodnamed actionPerformed This method is called whenever an actionevent is created Thus, the code you place inside the actionPerformedmethod is executed when an action event occurs

implemen-For example, here’s an actionPerformedmethod that responds toaction events:

public void actionPerformed(ActionEvent e){

if (e.getSource() == button1)button1.setText(“You clicked!”);

}Here, this code changes the text displayed by button1if the eventsource is button1

Trang 20

The ClickMe Program 526

4.Register the listener with the source.

The final step is to register the event listener with the event source.Every component that serves as an event source provides a method thatlets you register event listeners to listen for the event For ActionEventsources, the method is addActionListener Here’s a modification tothe frame constructor code that creates the button1button and regis-ters the frame class as the action event listener:

JPanel panel = new JPanel();

button1 = new JButton(“Click me!”);

The ClickMe Program

To see how all these elements work together in a complete program, Figure 2-1shows three incarnations of a frame created by a program called ClickMe.This program displays a frame that has a single button that initially saysClick Me!When the user clicks the button, the button’s text changes

toI’ve been clicked!as shown in the second frame in the figure.Then, if the user clicks the button again, the text changes to I’ve beenclicked 2 times!as shown in the third frame Thereafter, the countincreases each time the button is clicked Listing 2-1 shows the completecode for this program

Figure 2-1:

The ClickMeprogram inaction

Trang 21

Book VI Chapter 2

The ClickMe Program 527

L ISTING 2-1: T HE C LICK M E P ROGRAM

import javax.swing.*;

public class ClickMe extends JFrame implements ActionListener5 {

public static void main(String [] args)7 {

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

this.setTitle(“I’m Listening”);

JPanel panel1 = new JPanel();

button1 = new JButton(“Click Me!”);21 button1.addActionListener(this);22 panel1.add(button1);

this.add(panel1);

this.setVisible(true);

} private int clickCount = 0;29 public void actionPerformed(ActionEvent e)31 {

if (e.getSource() == button1)33 {

button1.setText(“I’ve been clicked!”);

else button1.setText(“I’ve been clicked “ + clickCount + “ times!”);

} } }

The following paragraphs point out some key lines of the program:

2 The program must import the java.awt.eventpackage, whichdefines the ActionEventclass and the ActionListenerinterfaces

Trang 22

Using Inner Classes to Listen for Events 528

5 The ClickMeclass extends the JFrameclass and implementsActionListener That way, this class does double-duty: It definesthe frame, and it listens for events generated by components added

to the frame

7 The mainmethod is required as usual It simply creates an instance

of the ClickMeclass to get the frame started

12 The button1variable is defined as a private class field so both theClickMeconstructor and the actionPerformedmethod canaccess it

14 The constructor does all the usual stuff that a constructor for a

frame class does: It sets the frame size, default close operation, andtitle, and then it adds components to the frame It ends by callingsetVisibleto make the frame visible on the screen

21 This line creates a button and assigns it to the button1field

22 This line adds the current object as an action listener for the

button1button

29 A field named clickCountis used to keep track of how many timesthe button has been clicked This field is initialized to zero when theobject is created

31 The actionPerformedmethod must be coded because the ClickMeclass implements the ActionListenerinterface This method iscalled by the button1object whenever the user clicks the button.The ActionEventparameter is the event generated by the buttonclick

33 The getSourcemethod of the ActionEventparameter is called todetermine the event source In this program, this ifstatement isn’treally required, because the program has only one event source.However, most Swing programs have more than one event source,

so you need to test the event source in the event listener

35 This statement increments the click count to indicate that the button

has been clicked

36 This ifstatement tests the value of the clickCountfield andchanges the text displayed by the button accordingly

Using Inner Classes to Listen for Events

As explained in Book III, Chapter 7, an inner class is a class that’s nested

within another class Inner classes are commonly used for event listeners.That way, the class that defines the frame doesn’t also have to implementthe event listener Instead, it includes an inner class that handles the events.Listing 2-2 shows a version of the ClickMe program that uses an inner class

to handle the action event for the button

Trang 23

Book VI Chapter 2

Using Inner Classes to Listen for Events 529

L ISTING 2-2: T HE C LICK M E 2 P ROGRAM WITH AN I NNER C LASS

this.add(panel1);

this.setVisible(true);

} private class ClickListener implements ActionListener32 {

private int clickCount = 0;34 public void actionPerformed(ActionEvent e)

{

if (e.getSource() == button1)38 {

clickCount++;

if (clickCount == 1) button1.setText(“I’ve been clicked!”);

else button1.setText(“I’ve been clicked “ + clickCount + “ times!”);

} } } }

Trang 24

Adding an Exit Button 530

This program works essentially the same as the program shown in Listing 2-1,

so I won’t review the basics Instead, I just point out some highlights:

4 The ClickMe2class still extends JFrame, but doesn’t implementActionListener

11 The button that serves as the event source must be referenced by a

class field so the inner class can access it This field can be private,because inner classes have access to private members of the classthat contains them

20 This statement creates an instance of the ClickListenerclass(the inner class) and assigns it to the variable c1

24 This statement adds c1as an action listener for the button Note thatbecause this frame has only one button, I could just as easily haveomitted line 20 and coded line 24 like this:

button1.addActionListener(new ClickListener());However, because most real-world applications have more than oneevent source, creating an instance of the listener class first, thenreusing that object as the listener for each event source is common

32 The ClickListenerclass is declared as an inner class by placingits declaration completely within the ClickMe2class The ClickListenerclass implements the ActionListenerinterface so itcan handle action events

34 The clickCountvariable is declared as a class field in the innerclass

38 The button1variable is available to the inner class here becauseinner classes can access private members of the class that containsthem

Adding an Exit Button

In Book VI, Chapter 1, you find out how to create a frame that exits the cation when the user clicks the frame’s Exit button To add an Exit button toyour application, you must do three things:

appli-1.Create the Exit button and add it to the frame.

Usually, you actually add the Exit button to a panel that is in turn added

to the frame

2.Add an action event listener to the button.

3.Add code in the actionPerformed method of the action listener to quit the application when the user clicks the button.

You normally do that by calling System.exit(0)

Trang 25

Book VI Chapter 2

Adding an Exit Button 531

In many applications, you don’t want to just blindly terminate the application

Instead, you should make sure the user has saved his or her data beforeending If not, you can either save the data automatically or require the user

to save the data before allowing the program to end

Suppose you want to change the ClickMe2application that is shown inListing 2-2 so that it has an Exit button, but the Exit button won’t let the userquit unless he or she has clicked the ClickMe button at least once First, youchange Line 11 to declare an exitButtonclass field:

private JButton button1, exitButton;

Next, you add code to the constructor to create the button, register theevent listener, and add the button to the panel:

exitButton = new JButton(“Exit”);

clickCount++;

if (clickCount == 1)button1.setText(“I’ve been clicked!”);

elsebutton1.setText(“I’ve been clicked “+ clickCount + “ times!”);

}else if (e.getSource() == exitButton){

if (clickCount > 0)System.exit(0);

else{JOptionPane.showMessageDialog(ClickMe3.this,

“You must click at least once!”,

“Not so fast, buddy”,JOptionPane.ERROR_MESSAGE);

}}}Here, an ifstatement is used to determine which button was clicked whenthe actionPerformedmethod is called This step is necessary becausethe ClickHandlerclass is used to handle action events for both buttons

If the event source is the Exit button, another ifstatement checks to see if

Trang 26

Catching the WindowClosing Event 532

the clickCountvariable is greater than zero If it is, System.exit(0)iscalled to end the application Otherwise, JOptionPaneis used to display

an error message, and the application is not ended

Unfortunately, just adding this logic to the Exit button isn’t enough, becausethe user can bypass your Exit button by clicking the frame’s Close button.What you want is for the frame Close button to act exactly like the Exit button

To do that, you need to add a window event listener in addition to an actionevent listener, as I describe in the next section

Catching the WindowClosing Event

Book VI, Chapter 1 shows you how to use the setDefaultCloseOperationmethod of the JFrameclass to let the user quit the application by using theframe’s Close button However, if your application checks to see if data hasbeen saved or other conditions have been met before allowing the user toexit, this approach won’t work In that case, you want to set up the Closebutton so it works the same as your Exit button

To do that, you need to add a listener that listens for window events to theframe When the user clicks the Close button, the frame generates awindowClosingevent which you can handle by registering a WindowListenerwith the frame itself Then, in the windowClosingmethod of the WindowListener, you can just call the Exit button’s doClickevent That triggers

an action event for the Exit button as if the user clicked it Thus, the Closebutton is handled in exactly the same way as the Exit button

The first step to setting up a window listener is getting rid of the defaultbehavior that automatically exits the application when the user clicks theClose button To do that, you must change the constant you use in thesetDefaultCloseOperationfrom EXIT_ON_CLOSEto DO_NOTHING_ON_CLOSE, like this:

this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);

That way, the default action of the JFrameclass is to completely ignore theClose button Then, you can install a window listener to handle the Closebutton any way you want

Next, you can set up the WindowListenerto listen for window events.One way to do that is to create an inner class that implements the WindowListenerinterface Unfortunately, the WindowListenerinterface has alot of methods, and you must provide an implementation for each methodeven if you don’t want to do anything for that method Thus, your WindowListenerlooks something like this:

private class Closer implements WindowListener{

Trang 27

Book VI Chapter 2

Catching the WindowClosing Event 533

public void windowClosing(WindowEvent e){

exitButton.doClick();

}public void windowActivated(WindowEvent e) {}

public void windowClosed(WindowEvent e) {}

public void windowDeactivated(WindowEvent e) {}

public void windowDeiconified(WindowEvent e) {}

public void windowIconified(WindowEvent e) {}

public void windowOpened(WindowEvent e) {}

}Finally, you register the WindowListenerwith the frame by calling itsaddWindowListenermethod in the frame class constructor:

Many of Java’s event listener interfaces have corresponding adapter classes

They’re listed in Table 2-3 Here’s what the Closer class looks like if youextend WindowAdapterinstead of implement WindowListener:private class Closer extends WindowAdapter

{public void windowClosing(WindowEvent e){

exitButton.doClick();

}}That saves some code However, you can save even more code by skippingthe Closerclass altogether, and handling the window closing event with ananonymous inner class instead Then, the statement in the frame construc-tor that registers the window event listener looks like this:

addWindowListener(new WindowAdapter(){

public void windowClosing(WindowEvent e){

exitButton.doClick();

}} );

Trang 28

The ClickMe Program Revisited 534

Here, the window listener is created as an anonymous inner class thatextends WindowAdapterand defines the windowClosingmethod

Table 2-3 Adapter Classes for Event Listeners

Listener Interface Adapter Class

The ClickMe Program Revisited

Now that you’ve mulled over the various techniques for creating an Exitbutton and handling the Close button, Listing 2-3 presents a third version ofthe ClickMe program that adds all these features so you can see how theywork together This version of the program adds an Exit button, but does notallow the user to quit until he or she has clicked the ClickMe button at leastonce And it treats the Close button as if the user had clicked Exit

L ISTING 2-3: T HE C LICK M E A PPLICATION WITH AN E XIT B UTTON

{ this.setSize(275,100);

this.setTitle(“I’m Listening”);

this.setDefaultCloseOperation(17 JFrame.DO_NOTHING_ON_CLOSE);

ClickListener cl = new ClickListener();

Trang 29

Book VI Chapter 2

The ClickMe Program Revisited 535

JPanel panel1 = new JPanel();

addWindowListener(new WindowAdapter()24 {

public void windowClosing(WindowEvent e) {

exitButton.doClick();28 }

{ private int clickCount = 0;

public void actionPerformed(ActionEvent e) {

if (e.getSource() == button1) {

clickCount++;

if (clickCount == 1) button1.setText(“I’ve been clicked!”);

else button1.setText(“I’ve been clicked “ + clickCount + “ times!”);

} else if (e.getSource() == exitButton)61 {

if (clickCount > 0) System.exit(0);

else { JOptionPane.showMessageDialog(

ClickMe3.this,

“You must click at least once!”,

“Not so fast, buddy”, JOptionPane.ERROR_MESSAGE);

} } } } }

Trang 30

The ClickMe Program Revisited 536

The following paragraphs draw your attention to the key sections of this program:

11 The exitButtonvariable is declared along with the button1able as a class field so it can be accessed from the inner classes

vari-➞17 The setDefaultCloseOperationmethod tells the JFrameclassthat no default action is taken if the user closes the window

24 A window listener is installed on the frame to listen for window

events This listener is constructed from an anonymous inner classthat extends the WindowAdapterclass

28 In the windowClosingmethod, the doClickmethod of the Exitbutton is called That way, the Close button is handled exactly as ifthe user had clicked the Exit button

36 This and the next two lines create the Exit button, register its action

event listener, and add it to the panel

61 In the actionPerformedmethod of the action listener class, this ifstatement checks to see if the action event came from the Exit button

If so, another ifstatement checks to see if the user has clicked theClickMe button at least once If so, the application exits Otherwise, amessage is displayed, and the program refuses to budge

Trang 31

Chapter 3: Getting Input from the User

a button, you can put the book down now But if you want to write grams that actually do something worthwhile, you need to use other Swingcomponents

pro-In this chapter, you find out how to use components that get informationfrom the user First, I cover two components that get text input from theuser: text fields, which get a line of text, and text areas, which get multiplelines Then, I move on to two components that get either/or informationfrom the user: radio buttons and check boxes

Along the way, I tell you about some features that let you decorate thesecontrols to make them more functional Specifically, I look at scroll bars,which are commonly used with text areas, and borders, which are used withradio buttons and check boxes

Using Text Fields

A text field is a box that the user can type text in You create text fields by

using the JTextFieldclass Table 3-1 shows some of the more interestingand useful constructors and methods of this class

Trang 32

Using Text Fields 538

Table 3-1 Handy JTextField Constructors and Methods

JTextField() Creates a new text field

JTextField(int cols) Creates a new text field with the specified width.JTextField(String text, Creates a new text field with the specified width and int cols) initial text value

String getText() Gets the text value entered into the field

void requestFocus() Asks for the focus to be moved to this text field.void setColumns Sets the size of the text field (Better to do this in the (int cols) constructor.)

void setEditable If false, makes the field read-only

(boolean value)void setText(String Sets the field’s text value

text)void setToolTipText Sets the tooltip text that’s displayed if the user rests (String text) the mouse over the text field for a few moments

When you create a text field by calling a constructor of the JTextFieldclass, you can specify the width of the text field and an initial text value, as

in these examples:

JTextField text1 = new JTextField(15);

JTextField text2 = new JTextField(“Initial Value”, 20);

The width is specified in columns, which is a vague and imprecise ment that’s roughly equal to the width of one character in the font that thetext field uses You have to experiment a bit to get the text fields the right size.The usual way to work with text fields is to create them in the frame construc-tor, and then retrieve text entered by the user in the actionPerformedmethod of an action listener attached to one of the frame’s buttons usingcode like this:

measure-String lastName = textLastName.getText();

Here, the value entered by the user into the textLastNametext field isassigned to the String variable lastName

The following paragraphs describe a few additional details you need to knowabout using text fields:

✦ When you use a text field, you usually also want to place a label nearby

to tell the user what type of text to enter into the field

Trang 33

Book VI Chapter 3

Using Text Fields 539

✦ You can create a read-only text field by calling the setEditablemethodwith a value of false The text field has a border around it like a regulartext field, but the background is gray instead of white and the user can’tchange the text displayed by the control

✦ In most programs, you want to make sure that the user enters able data into text fields This is especially true if the user is supposed

accept-to enter numeric data inaccept-to the text fields, as I describe in the section

“Using text fields for numeric entry,” later in this chapter

Looking at a sample programFigure 3-1 shows the operation of a simple program that uses a text field to askfor the user’s name If the user enters a name, the program uses JOptionPane

to say good morning to the user by displaying the middle message box shown

in Figure 3-1 But if the user clicks the button without entering anything, theprogram displays the second JOptionPanemessage shown at the bottom

The code for this program is shown in Listing 3-1

L ISTING 3-1: S AYING G OOD M ORNING WITH A T EXT F IELD

in action

Trang 34

Using Text Fields 540

L ISTING 3-1 (C ONTINUED )

private JButton buttonOK;

private JTextField textName;12 public Namer()

{ this.setSize(325,100);

this.setTitle(“Who Are You?”);

this.setDefaultCloseOperation(

JFrame.EXIT_ON_CLOSE);

ButtonListener bl = new ButtonListener();

JPanel panel1 = new JPanel();

panel1.add(new JLabel(“Enter your name: “));25 textName = new JTextField(15);27 panel1.add(textName);

buttonOK = new JButton(“OK”);

{ public void actionPerformed(ActionEvent e) {

if (e.getSource() == buttonOK) {

String name = textName.getText();46

if (name.length() == 0)47 {

JOptionPane.showMessageDialog(

Namer.this,

“You didn’t enter anything!”,

“Moron”, JOptionPane.INFORMATION_MESSAGE); }

else { JOptionPane.showMessageDialog(

Namer.this,

“Good morning “ + name,

“Salutations”,

Trang 35

Book VI Chapter 3

Using Text Fields 541

JOptionPane.INFORMATION_MESSAGE);

} textName.requestFocus();63 }

} } }

This program isn’t very complicated, so the following paragraphs just hit thehighlights:

4 The name of the frame class is Namer

12 A class variable is used to store a reference to the text field so that

both the constructor and the action listener can access it

25 A label is created to tell the user what data to enter into the text field.

27 The text field is created with a length of 15 columns, and then added

to the panel

46 In the actionPerformedmethod of the action listener class, thisstatement retrieves the value entered by the user and stores it in astring variable

47 This ifstatement checks to see if the user entered anything byexamining the length of the string variable created in line 46 If thelength is zero, JOptionPaneis used to display an error message

Otherwise, JOptionPaneis used to say good morning to the user

63 The requestFocusmethod is called to move the focus back to thetext field after the user clicks the button If you don’t do this, focusstays on the button and the user has to use the Tab key to move thefocus to the text field

Using text fields for numeric entryYou need to take special care if you’re using a text field to get numeric datafrom the user The getTextmethod returns a string value You can passthis value to one of the parse methods of the wrapper classes for the primi-tive numeric types For example, to convert the value entered into a text box

to an int, you use the parseIntmethod:

int count = Integer.parseInt(textCount.getText());

Here, the result of the getTextmethod is used as the parameter to theparseIntmethod

Table 3-2 lists the parse methods for the various wrapper classes Note thateach of these methods throws NumberFormatExceptionif the string

Trang 36

Using Text Fields 542

can’t be converted As a result, you need to call the parseIntmethod in atry/catchblock to catch this exception

Table 3-2 Methods that Convert Strings to Numbers

Wrapper Class Parse Method

con-to an int The method returns a boolean that indicates whether the fieldcontains a valid integer:

private boolean isInt(JTextField f, String msg){

try{Integer.parseInt(f.getText());

return true;

}catch (NumberFormatException e){

JOptionPane.showMessageDialog(f,

“Entry Error”, msg,JOptionPane.ERROR_MESSAGE);

f.requestFocus();

return false;

}}

Then, you can call this method whenever you need to check to see if a textfield has a valid integer For example, here’s the actionPerformedmethodfor a program that gets the value entered in a textCounttext field and dis-plays it in a JOptionPanemessage box if the value entered is a valid integer:public void actionPerformed(ActionEvent e)

{

if (e.getSource() == buttonOK){

if (isInt(textCount,

“You must enter an integer.”))

Trang 37

Book VI Chapter 3

Using Text Fields 543

{JOptionPane.showMessageDialog(Number.this,

“You entered “+

Integer.parseInt(textCount.getText()),

“Your Number”,JOptionPane.INFORMATION_MESSAGE);

}textCount.requestFocus();

}}Here, the isIntmethod is called to make sure the text entered by the usercan be converted to an int If so, the text is converted to an intand dis-played in a message box (In this example, the name of the outer class isNumber, which is why the first parameter of the showMessageDialogmethod specifies Number.this.)

Creating a validation class

If you’re feeling really ambitious, you can create a separate class to holdmethods that do data validation I suggest you make the methods static soyou don’t have to create an instance of the validation class to use its meth-ods And to avoid parsing the data twice, write the validation methods sothey return two values: a boolean that indicates whether the data could beparsed, and a primitive that provides the parsed value

Of course, a method can return only one value The only way to coax amethod into returning two values is to return an object that contains both ofthe values And to do that, you have to create a class that defines the object

Here’s an example of a class you could use as the return value of a methodthat validates integers:

public class IntValidationResult{

public boolean isValid;

public int value;

}And here’s a class that provides a static method named isIntthat vali-dates integer data and returns an IntValidationResultobject:

public class Validation{

public static IntValidationResult isInt(

JTextField f, String msg){

IntValidationResult result = new IntValidationResult();

try

Trang 38

Using Text Areas 544

{result.value =Integer.parseInt(f.getText());

result.isValid = true;

return result;

}catch (NumberFormatException e){

JOptionPane.showMessageDialog(f,

“Entry Error”, msgJOptionPane.ERROR_MESSAGE);

Here’s an actionPerformedmethod that uses the isIntmethod of thisclass to validate the textCountfield:

public void actionPerformed(ActionEvent e){

if (e.getSource() == buttonOK){

IntValidationResult ir;

ir = Validation.isInt(textCount,

“You must enter an integer.”);

if (ir.isValid){

JOptionPane.showMessageDialog(Number2.this,

“You entered “ + ir.value,

“Your Number”,JOptionPane.INFORMATION_MESSAGE);

}textCount.requestFocus();

}}

Using Text Areas

A text area is similar to a text field, but lets the user enter more than one line

of text If the user enters more text into the text area than can be displayed

at once, the text area can use a scroll bar to let the user scroll to see theentire text Figure 3-2 shows a text area in action

To create a text area like the one shown in Figure 3-2, you must actually usetwo classes First, you use the JTextAreaclass to create the text area Butunfortunately, text areas by themselves don’t have scroll bars So you have

Trang 39

Book VI Chapter 3

Using Text Areas 545

to add the text area to a second component called a scroll pane, created by

the JScrollPaneclass Then, you add the scroll pane, not the text area, to

a panel so it can be displayed

Creating a text area isn’t as hard as it sounds Here’s the code I used tocreate the text area shown in Figure 3-2, which I then added to a panel:

textNovel = new JTextArea(10, 20);

JScrollPane scroll = new JScrollPane(textNovel,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);

panel1.add(scroll);

Here, the first statement creates a text area, giving it an initial size of 10 rowsand 20 columns Then, the second statement creates a scroll pane Noticethat the text area object is passed as a parameter to the constructor for theJScrollPane, along with constants that indicate whether the scroll paneshould include vertical or horizontal scroll bars (or both) Finally, the thirdstatement adds the scroll pane to the panel named panel1

The following sections describe the constructors and methods of theJTextAreaand JScrollPaneclasses in more detail

The JTextArea classTable 3-3 lists the most popular constructors and methods of the JTextAreaclass, which you use to create text areas In most cases, you use the secondconstructor, which lets you set the number of rows and columns to display

The rowsparameter governs the height of the text area, while the colsparameter sets the width

Figure 3-2:

A frame thatuses a textarea

Trang 40

Using Text Areas 546

Table 3-3 Clever JTextArea Constructors and Methods

JTextArea() Creates a new text area

JTextArea(int rows, Creates a new text area large enough to display int cols) the specified number of rows and columns.JTextArea(String text, Creates a new text area with the specified initial int rows, int cols) text value, large enough to display the specified

number of rows and columns

void setColumns(int cols) Sets the width of the text area (It’s better to do this

in the constructor.)void setEditable(boolean If false, makes the field read only

value)void setLineWrap(boolean If true, lines wrap if the text doesn’t fit on one

void setText(String text) Sets the field’s text value

void setToolTipText Sets the tooltip text that’s displayed if the user rests (String text) the mouse over the text field for a few moments.void setWrapStyleWord() If true, the text wraps at word boundaries

To retrieve the text entered by the user into a text area, you use the getTextmethod For example, here’s an actionPerformedmethod from an actionlistener that retrieves text from a text area:

public void actionPerformed(ActionEvent e){

if (e.getSource() == buttonOK){

String text = textNovel.getText();

if (text.contains(“All work and no play”))JOptionPane.showMessageDialog(textNovel,

“Can’t you see I’m working?”,

“Going Crazy”,JOptionPane.ERROR_MESSAGE);

}}

Ngày đăng: 12/08/2014, 19:21

TỪ KHÓA LIÊN QUAN