Survey
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
Chapter 13 GUI Basics Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved. 0136012671 1 Motivations The design of the API for Java GUI programming is an excellent example of how the object-oriented principle is applied. In the chapters that follow, you will learn the framework of Java GUI API and use the GUI components to develop user-friendly interfaces for applications and applets. Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved. 0136012671 2 Creating GUI Objects // Create a button with text OK JButton jbtOK = new JButton("OK"); // Create a label with text "Enter your name: " JLabel jlblName = new JLabel("Enter your name: "); Label Text field Check Box Radio Button Button // Create a text field with text "Type Name Here" JTextField jtfName = new JTextField("Type Name Here"); Combo Box // Create a check box with text bold JCheckBox jchkBold = new JCheckBox("Bold"); // Create a radio button with text red JRadioButton jrbRed = new JRadioButton("Red"); // Create a combo box with choices red, green, and blue JComboBox jcboColor = new JComboBox(new String[]{"Red", "Green", "Blue"}); Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved. 0136012671 3 Swing vs. AWT So why do the GUI component classes have a prefix J? Instead of JButton, why not name it simply Button? In fact, there is a class already named Button in the java.awt package. When Java was introduced, the GUI classes were bundled in a library known as the Abstract Windows Toolkit (AWT). For every platform on which Java runs, the AWT components are automatically mapped to the platform-specific components through their respective agents, known as peers. AWT is fine for developing simple graphical user interfaces, but not for developing comprehensive GUI projects. Besides, AWT is prone to platform-specific bugs because its peer-based approach relies heavily on the underlying platform. With the release of Java 2, the AWT user-interface components were replaced by a more robust, versatile, and flexible library known as Swing components. Swing components are painted directly on canvases using Java code, except for components that are subclasses of java.awt.Window or java.awt.Panel, which must be drawn using native GUI on a specific platform. Swing components are less dependent on the target platform and use less of the native GUI resource. For this reason, Swing components that don’t rely on native GUI are referred to as lightweight components, and AWT components are referred to as heavyweight components. Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved. 0136012671 4 Container Classes Dimension Classes in the java.awt package LayoutManager Font Heavyweight 1 FontMetrics Object Color Panel Applet JApplet Window Frame JFrame Dialog JDialog Graphics Component Container * Container classes can contain other GUI components. JComponent JPanel Swing Components in the javax.swing package Lightweight Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved. 0136012671 5 GUI Helper Classes Dimension Font Classes in the java.awt package LayoutManager Heavyweight 1 FontMetrics Object Color Panel Applet JApplet Window Frame JFrame Dialog JDialog Graphics Component Container * The helper classes are not subclasses of Component. They are used to describe the properties of GUI components such as graphics context, colors, fonts, and dimension. JComponent JPanel Swing Components in the javax.swing package Lightweight Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved. 0136012671 6 Swing GUI Components JCheckBoxMenuItem AbstractButton JComponent JMenuItem JMenu JButton JRadioButtonMenuItem JToggleButton JCheckBox JRadioButton JEditorPane JTextComponent JTextField JPasswordField JTextArea JLabel JTabbedPane JToolBar JTree JComboBox JList JSplitPane JMenuBar JTable JPanel JLayeredPane JPopupMenu JTableHeader JOptionPane JSeparator JFileChooser JInternalFrame JScrollBar JSlider JScrollPane JRootPane JColorChooser JProgressBar Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved. 0136012671 JToolTip JSpinner 7 Components Covered in the Comprehensive Version JCheckBoxMenuItem AbstractButton JComponent JMenuItem JMenu JButton JRadioButtonMenuItem JToggleButton JCheckBox JRadioButton JEditorPane JTextComponent JTextField JPasswordField JTextArea JLabel JTabbedPane JToolBar JTree JComboBox JList JSplitPane JMenuBar JTable JPanel JLayeredPane JPopupMenu JTableHeader JOptionPane JSeparator JFileChooser JInternalFrame JScrollBar JSlider JScrollPane JRootPane JColorChooser JProgressBar Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved. 0136012671 JToolTip JSpinner 8 AWT (Optional) AWTEvent Font FontMetrics Object Color Graphics Component Container Panel Applet Button Window Frame Label TextField Dialog FileDialog TextComponent List TextArea Choice CheckBox LayoutManager CheckBoxGroup Canvas MenuComponent Scrollbar MenuItem Menu MenuBar Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved. 0136012671 9 Frames Frame is a window that is not contained inside another window. Frame is the basis to contain other user interface components in Java GUI applications. The JFrame class can be used to create windows. For Swing GUI programs, use JFrame class to create widows. Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved. 0136012671 10 Creating Frames import javax.swing.*; public class MyFrame { public static void main(String[] args) { JFrame frame = new JFrame("Test Frame"); frame.setSize(400, 300); frame.setVisible(true); frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE); } } MyFrame Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved. 0136012671 Run 11 Adding Components into a Frame Title bar // Add a button into the frame frame.getContentPane().add( new JButton("OK")); Content pane MyFrameWithComponents Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved. 0136012671 Run 12 Content Pane Delegation in JDK 1.5 // Add a button into the frame frame.getContentPane().add( new JButton("OK")); Title bar Content pane // Add a button into the frame frame.add( new JButton("OK")); Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved. 0136012671 13 JFrame Class javax.swing.JFrame +JFrame() Creates a default frame with no title. +JFrame(title: String) Creates a frame with the specified title. +setSize(width: int, height: int): void Specifies the size of the frame. +setLocation(x: int, y: int): void Specifies the upper-left corner location of the frame. +setVisible(visible: boolean): void Sets true to display the frame. +setDefaultCloseOperation(mode: int): void Specifies the operation when the frame is closed. +setLocationRelativeTo(c: Component): void Sets the location of the frame relative to the specified component. If the component is null, the frame is centered on the screen. +pack(): void Automatically sets the frame size to hold the components in the frame. Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved. 0136012671 14 Layout Managers Java’s layout managers provide a level of abstraction to automatically map your user interface on all window systems. The UI components are placed in containers. Each container has a layout manager to arrange the UI components within the container. Layout managers are set in containers using the setLayout(LayoutManager) method in a container. Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved. 0136012671 15 FlowLayout Example Write a program that adds three labels and text fields into the content pane of a frame with a FlowLayout manager. ShowFlowLayout Run Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved. 0136012671 16 The FlowLayout Class java.awt.FlowLayout The get and set methods for these data fields are provided in the class, but omitted in the UML diagram for brevity. -alignment: int The alignment of this layout manager (default: CENTER). -hgap: int The horizontal gap of this layout manager (default: 5 pixels). -vgap: int The vertical gap of this layout manager (default: 5 pixels). +FlowLayout() Creates a default FlowLayout manager. +FlowLayout(alignment: int) Creates a FlowLayout manager with a specified alignment. +FlowLayout(alignment: int, hgap: int, vgap: int) Creates a FlowLayout manager with a specified alignment, horizontal gap, and vertical gap. Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved. 0136012671 17 GridLayout Example Rewrite the program in the preceding example using a GridLayout manager instead of a FlowLayout manager to display the labels and text fields. ShowGridLayout Run Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved. 0136012671 18 The GridLayout Class java.awt.GridLayout The get and set methods for these data fields are provided in the class, but omitted in the UML diagram for brevity. -rows: int The number of rows in this layout manager (default: 1). -columns: int The number of columns in this layout manager (default: 1). -hgap: int The horizontal gap of this layout manager (default: 0). -vgap: int The vertical gap of this layout manager (default: 0). +GridLayout() Creates a default GridLayout manager. +GridLayout(rows: int, columns: int) Creates a GridLayout with a specified number of rows and columns. +GridLayout(rows: int, columns: int, Creates a GridLayout manager with a specified number of rows and hgap: int, vgap: int) columns, horizontal gap, and vertical gap. Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved. 0136012671 19 The BorderLayout Manager The BorderLayout manager divides the container into five areas: East, South, West, North, and Center. Components are added to a BorderLayout by using the add method. add(Component, constraint), where constraint is BorderLayout.EAST, BorderLayout.SOUTH, BorderLayout.WEST, BorderLayout.NORTH, or BorderLayout.CENTER. Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved. 0136012671 20 BorderLayout Example ShowBorderLayout Run Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved. 0136012671 21 The BorderLayout Class java.awt.BorderLayout The get and set methods for these data fields are provided in the class, but omitted in the UML diagram for brevity. -hgap: int The horizontal gap of this layout manager (default: 0). -vgap: int The vertical gap of this layout manager (default: 0). +BorderLayout() Creates a default BorderLayout manager. +BorderLayout(hgap: int, vgap: int) Creates a BorderLayout manager with a specified number of horizontal gap, and vertical gap. Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved. 0136012671 22 The Color Class You can set colors for GUI components by using the java.awt.Color class. Colors are made of red, green, and blue components, each of which is represented by a byte value that describes its intensity, ranging from 0 (darkest shade) to 255 (lightest shade). This is known as the RGB model. Color c = new Color(r, g, b); r, g, and b specify a color by its red, green, and blue components. Example: Color c = new Color(228, 100, 255); Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved. 0136012671 23 Standard Colors Thirteen standard colors (black, blue, cyan, darkGray, gray, green, lightGray, magenta, orange, pink, red, white, yellow) are defined as constants in java.awt.Color. The standard color names are constants, but they are named as variables with lowercase for the first word and uppercase for the first letters of subsequent words. Thus the color names violate the Java naming convention. Since JDK 1.4, you can also use the new constants: BLACK, BLUE, CYAN, DARK_GRAY, GRAY, GREEN, LIGHT_GRAY, MAGENTA, ORANGE, PINK, RED, WHITE, and YELLOW. Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved. 0136012671 24 Setting Colors You can use the following methods to set the component’s background and foreground colors: setBackground(Color c) setForeground(Color c) Example: jbt.setBackground(Color.yellow); jbt.setForeground(Color.red); Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved. 0136012671 25 The Font Class Font Names Standard font names that are supported in all platforms are: SansSerif, Serif, Monospaced, Dialog, or DialogInput. Font Style Font.PLAIN (0), Font.BOLD (1), Font.ITALIC (2), and Font.BOLD + Font.ITALIC (3) Font myFont = new Font(name, style, size); Example: Font myFont = new Font("SansSerif ", Font.BOLD, 16); Font myFont = new Font("Serif", Font.BOLD+Font.ITALIC, 12); JButton jbtOK = new JButton("OK“); jbtOK.setFont(myFont); Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved. 0136012671 26 Finding All Available Font Names GraphicsEnvironment e = GraphicsEnvironment.getLocalGraphicsEnvironment(); String[] fontnames = e.getAvailableFontFamilyNames(); for (int i = 0; i < fontnames.length; i++) System.out.println(fontnames[i]); Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved. 0136012671 27 Using Panels as Sub-Containers Panels act as sub-containers for grouping user interface components. It is recommended that you place the user interface components in panels and place the panels in a frame. You can also place panels in a panel. To add a component to JFrame, you actually add it to the content pane of JFrame. To add a component to a panel, you add it directly to the panel using the add method. Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved. 0136012671 28 Creating a JPanel You can use new JPanel() to create a panel with a default FlowLayout manager or new JPanel(LayoutManager) to create a panel with the specified layout manager. Use the add(Component) method to add a component to the panel. For example, JPanel p = new JPanel(); p.add(new JButton("OK")); Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved. 0136012671 29 Testing Panels Example This example uses panels to organize components. The program creates a user interface for a Microwave oven. frame A textfield p2 A button 12 buttons p1 TestPanels Run Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved. 0136012671 30 Common Features of Swing Components java.awt.Component The get and set methods for these data fields are provided in the class, but omitted in the UML diagram for brevity. -font: java.awt.Font The font of this component. -background: java.awt.Color The background color of this component. -foreground: java.awt.Color The foreground color of this component. -preferredSize: Dimension The preferred size of this component. -visible: boolean Indicates whether this component is visible. +getWidth(): int Returns the width of this component. +getHeight(): int Returns the height of this component. +getX(): int getX() and getY() return the coordinate of the component’s upper-left corner within its parent component. +getY(): int java.awt.Container +add(comp: Component): Component Adds a component to the container. +add(comp: Component, index: int): Component Adds a component to the container with the specified index. Removes the component from the container. +remove(comp: Component): void +getLayout(): LayoutManager Returns the layout manager for this container. +setLayout(l: LayoutManager): void Sets the layout manager for this container. +paintComponents(g: Graphics): void Paints each of the components in this container. The get and set methods for these data fields are provided in the class, but omitted in the UML diagram for brevity. javax.swing.JComponent -toolTipText: String The tool tip text for this component. Tool tip text is displayed when the mouse points on the component without clicking. -border: javax.swing.border.Border The border for this component. Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved. 0136012671 31 Borders You can set a border on any object of the JComponent class. Swing has several types of borders. To create a titled border, use new TitledBorder(String title). To create a line border, use new LineBorder(Color color, int width), where width specifies the thickness of the line. For example, the following code displays a titled border on a panel: JPanel panel = new JPanel(); panel.setBorder(new TitleBorder(“My Panel”)); Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved. 0136012671 32 Test Swing Common Features Component Properties JComponent Properties font background foreground preferredSize minimumSize maximumSize toolTipText border TestSwingCommonFeatures Run Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved. 0136012671 33 Image Icons Java uses the javax.swing.ImageIcon class to represent an icon. An icon is a fixed-size picture; typically it is small and used to decorate components. Images are normally stored in image files. You can use new ImageIcon(filename) to construct an image icon. For example, the following statement creates an icon from an image file us.gif in the image directory under the current class path: ImageIcon icon = new ImageIcon("image/us.gif"); TestImageIcon Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved. 0136012671 Run 34 Chapter 15 Event-Driven Programming Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved. 0136012671 35 Procedural vs. Event-Driven Programming Procedural programming is executed in procedural order. In event-driven programming, code is executed upon activation of events. Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved. 0136012671 36 Revisit Listing 11.7 Taste of Event-Driven Programming The example displays a button in the frame. A message is displayed on the console when a button is clicked. HandleEvent Run Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved. 0136012671 37 Events An event can be defined as a type of signal to the program that something has happened. The event is generated by external user actions such as mouse movements, mouse clicks, and keystrokes, or by the operating system, such as a timer. Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved. 0136012671 38 Event Classes EventObject AWTEvent ActionEvent ContainerEvent AdjustmentEvent FocusEvent ComponentEvent InputEvent ItemEvent PaintEvent TextEvent WindowEvent MouseEvent KeyEvent ListSelectionEvent Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved. 0136012671 39 Event Information An event object contains whatever properties are pertinent to the event. You can identify the source object of the event using the getSource() instance method in the EventObject class. The subclasses of EventObject deal with special types of events, such as button actions, window events, component events, mouse movements, and keystrokes. Table 15.1 lists external user actions, source objects, and event types generated. Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved. 0136012671 40 Selected User Actions User Action Source Object Event Type Generated Click a button JButton ActionEvent Click a check box JCheckBox ItemEvent, ActionEvent Click a radio button JRadioButton ItemEvent, ActionEvent Press return on a text field JTextField ActionEvent Select a new item JComboBox ItemEvent, ActionEvent Window opened, closed, etc. Window WindowEvent Mouse pressed, released, etc. Component MouseEvent Key released, pressed, etc. Component KeyEvent Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved. 0136012671 41 The Delegation Model Trigger an event source: SourceClass User Action XListener +addXListener(listener: XListener) (a) A generic source component with a generic listener +handler(event: XEvent) Register by invoking source.addXListener(listener); listener: ListenerClass source: JButton ActionListener +addActionListener(listener: ActionListener) +actionPerformed(event: ActionEvent) (b) A JButton source component with an ActionListener Register by invoking source.addActionListener(listener); listener: CustomListenerClass Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved. 0136012671 42 Internal Function of a Source Component source: SourceClass source: JButton +addXListener(XListener listener) An event is triggered event: XEvent Invoke listener1.handler(event) listener2.handler(event) … listenern.handler(event) +addActionListener(ActionListener listener) Keep it a list An event is triggered listener1 listener2 … listenern event: ActionEvent (a) Internal function of a generic source object Keep it a list Invoke listener1.actionPerformed(event) listener2.actionPerformed(event) … listenern.actionPerformed(event) listener1 listener2 … listenern (b) Internal function of a JButton object +handler( Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved. 0136012671 +handler( 43 The Delegation Model: Example JButton jbt = new JButton("OK"); ActionListener listener = new OKListener(); jbt.addActionListener(listener); Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved. 0136012671 44 Selected Event Handlers Event Class Listener Interface Listener Methods (Handlers) ActionEvent ItemEvent WindowEvent ActionListener ItemListener WindowListener ContainerEvent ContainerListener MouseEvent MouseListener KeyEvent KeyListener actionPerformed(ActionEvent) itemStateChanged(ItemEvent) windowClosing(WindowEvent) windowOpened(WindowEvent) windowIconified(WindowEvent) windowDeiconified(WindowEvent) windowClosed(WindowEvent) windowActivated(WindowEvent) windowDeactivated(WindowEvent) componentAdded(ContainerEvent) componentRemoved(ContainerEvent) mousePressed(MouseEvent) mouseReleased(MouseEvent) mouseClicked(MouseEvent) mouseExited(MouseEvent) mouseEntered(MouseEvent) keyPressed(KeyEvent) keyReleased(KeyEvent) keyTypeed(KeyEvent) Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved. 0136012671 45 java.awt.event.ActionEvent java.util.EventObject +getSource(): Object Returns the object on which the event initially occurred. java.awt.event.AWTEvent java.awt.event.ActionEvent +getActionCommand(): String Returns the command string associated with this action. For a button, its text is the command string. +getModifiers(): int Returns the modifier keys held down during this action event. +getWhen(): long Returns the timestamp when this event occurred. The time is the number of milliseconds since January 1, 1970, 00:00:00 GMT. SimpleEventDemo Run Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved. 0136012671 46 Inner Class Listeners A listener class is designed specifically to create a listener object for a GUI component (e.g., a button). It will not be shared by other applications. So, it is appropriate to define the listener class inside the frame class as an inner class. Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved. 0136012671 47 Inner Classes Inner class: A class is a member of another class. Advantages: In some applications, you can use an inner class to make programs simple. An inner class can reference the data and methods defined in the outer class in which it nests, so you do not need to pass the reference of the outer class to the constructor of the inner class. ShowInnerClass Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved. 0136012671 48 Inner Classes, cont. public class Test { ... } // OuterClass.java: inner class demo public class OuterClass { private int data; /** A method in the outer class */ public void m() { // Do something } public class A { ... } (a) // An inner class class InnerClass { /** A method in the inner class */ public void mi() { // Directly reference data and method // defined in its outer class data++; m(); } } public class Test { ... // Inner class public class A { ... } } (b) } (c) Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved. 0136012671 49 Inner Classes (cont.) Inner classes can make programs simple and concise. An inner class supports the work of its containing outer class and is compiled into a class named OuterClassName$InnerClassName.class. For example, the inner class InnerClass in OuterClass is compiled into OuterClass$InnerClass.class. Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved. 0136012671 50 Revisiting SimpleEventDemo Using Inner Classes SimpleEventDemoInnerClass Run Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved. 0136012671 51 Anonymous Inner Classes An anonymous inner class must always extend a superclass or implement an interface, but it cannot have an explicit extends or implements clause. An anonymous inner class must implement all the abstract methods in the superclass or in the interface. An anonymous inner class always uses the no-arg constructor from its superclass to create an instance. If an anonymous inner class implements an interface, the constructor is Object(). An anonymous inner class is compiled into a class named OuterClassName$n.class. For example, if the outer class Test has two anonymous inner classes, these two classes are compiled into Test$1.class and Test$2.class. Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved. 0136012671 52 Anonymous Inner Classes (cont.) Inner class listeners can be shortened using anonymous inner classes. An anonymous inner class is an inner class without a name. It combines declaring an inner class and creating an instance of the class in one step. An anonymous inner class is declared as follows: new SuperClassName/InterfaceName() { // Implement or override methods in superclass or interface // Other methods if necessary } Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved. 0136012671 53 Revising SimpleEventDemo Using Anonymous Inner Classes AnonymousListenerClass Run Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved. 0136012671 54 Example: Controlling Balls Objective: Use buttons to enlarge or shrink a ball. ControlBall Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved. 0136012671 Run 55 Example: Handling Window Events Objective: Demonstrate handling the window events. Any subclass of the Window class can generate the following window events: window opened, closing, closed, activated, deactivated, iconified, and deiconified. This program creates a frame, listens to the window events, and displays a message to indicate the occurring event. TestWindowEvent Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved. 0136012671 Run 56 MouseEvent java.awt.event.InputEvent +getWhen(): long Returns the timestamp when this event occurred. +isAltDown(): boolean Returns whether or not the Alt modifier is down on this event. +isControlDown(): boolean Returns whether or not the Control modifier is down on this event. +isMetaDown(): boolean Returns whether or not the Meta modifier is down on this event +isShiftDown(): boolean Returns whether or not the Shift modifier is down on this event. java.awt.event.MouseEvent +getButton(): int Indicates which mouse button has been clicked. +getClickCount(): int Returns the number of mouse clicks associated with this event. +getPoint(): java.awt.Point Returns a Point object containing the x and y coordinates. +getX(): int Returns the x-coordinate of the mouse point. +getY(): int Returns the y-coordinate of the mouse point. Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved. 0136012671 57 Handling Mouse Events Java provides two listener interfaces, MouseListener and MouseMotionListener, to handle mouse events. The MouseListener listens for actions such as when the mouse is pressed, released, entered, exited, or clicked. The MouseMotionListener listens for actions such as dragging or moving the mouse. Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved. 0136012671 58 Handling Mouse Events java.awt.event.MouseListener +mousePressed(e: MouseEvent): void Invoked when the mouse button has been pressed on the source component. +mouseReleased(e: MouseEvent): void Invoked when the mouse button has been released on the source component. +mouseClicked(e: MouseEvent): void Invoked when the mouse button has been clicked (pressed and released) on the source component. +mouseEntered(e: MouseEvent): void Invoked when the mouse enters the source component. +mouseExited(e: MouseEvent): void Invoked when the mouse exits the source component. java.awt.event.MouseMotionListener +mouseDragged(e: MouseEvent): void Invoked when a mouse button is moved with a button pressed. +mouseMoved(e: MouseEvent): void Invoked when a mouse button is moved without a button pressed. Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved. 0136012671 59 Example: Moving Message Using Mouse Objective: Create a program to display a message in a panel. You can use the mouse to move the message. The message moves as the mouse drags and is always displayed at the mouse point. MoveMessageDemo Run Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved. 0136012671 60 The Timer Class Some non-GUI components can fire events. The javax.swing.Timer class is a source component that fires an ActionEvent at a predefined rate. javax.swing.Timer +Timer(delay: int, listener: ActionListener) Creates a Timer with a specified delay in milliseconds and an ActionListener. +addActionListener(listener: ActionListener): void Adds an ActionListener to the timer. +start(): void Starts this timer. +stop(): void Stops this timer. +setDelay(delay: int): void Sets a new delay value for this timer. The Timer class can be used to control animations. For example, you can use it to display a moving message. AnimationDemo Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved. 0136012671 Run 61 Chapter 16 Creating User Interfaces Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved. 0136012671 62 Motivations 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 components in Java are very flexible and versatile, you can create a wide assortment of useful user interfaces. Previous chapters briefly introduced several GUI components. This chapter introduces the frequently used GUI components in detail (see Figure 16.1). Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved. 0136012671 63 Components Covered in the Chapter Introduces the frequently used GUI components Uses borders and icons JButton Component Container JComponent AbstractButton JCheckBox JToggleButton JRadioButton JLabel JTextArea JTextComponent JTextField JPasswordField JComboBox JList JScrollBar JSlider Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved. 0136012671 64 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 buttons are generalized in javax.swing.AbstractButton. Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved. 0136012671 65 AbstractButton 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 The action command of this button. -text: String The button’s text (i.e., the text label on the button). -icon: javax.swing.Icon The button’s default icon. This icon is also used as the "pressed" and "disabled" icon if there is no explicitly set pressed icon. -pressedIcon: javax.swing.Icon The pressed icon (displayed when the button is pressed). -rolloverIcon: javax.swing.Icon The rollover icon (displayed when the mouse is over the button). -mnemonic: int The mnemonic key value of this button. You can select the button by pressing the ALT key and the mnemonic key at the same time. -horizontalAlignment: int The horizontal alignment of the icon and text (default: CENTER). -horizontalTextPosition: int The horizontal text position relative to the icon (default: RIGHT). -verticalAlignment: int The vertical alignment of the icon and text (default: CENTER). -verticalTextPosition: int The vertical text position relative to the icon (default: CENTER). -borderPainted: boolean Indicates whether the border of the button is painted. By default, a regular button’s border is painted, but the borders for a check box and a radio button is not painted. -iconTextGap: int The gap between the text and the icon on the button (JDK 1.4). -selected(): boolean The state of the button. True if the check box or radio button is selected, false if it's not. Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved. 0136012671 66 JButton JButton inherits AbstractButton and provides several constructors to create buttons. javax.swing.AbstractButton javax.swing.JButton +JButton() Creates a default button with no text and icon. +JButton(icon: javax.swing.Icon) Creates a button with an icon. +JButton(text: String) Creates a button with text. +JButton(text: String, icon: Icon) Creates a button with text and an icon. Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved. 0136012671 67 JButton Properties (inherited) text icon mnemonic horizontalAlignment verticalAlignment horizontalTextPosition verticalTextPosition iconTextGap Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved. 0136012671 68 Example: Using Buttons Write a program that displays a message on a panel and uses two buttons, <= and =>, to move the message on the panel to the left or right. ButtonDemo Run MessagePanel JButton JButton Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved. 0136012671 69 JCheckBox JCheckBox inherits all the properties such as text, icon, mnemonic, verticalAlignment, horizontalAlignment, horizontalTextPosition, verticalTextPosition, and selected from AbstractButton, and provides several constructors to create check boxes. javax.swing.AbstractButton javax.swing.JToggleButton javax.swing.JCheckBox +JCheckBox() Creates a default check box button with no text and icon. +JCheckBox(text: String) Creates a check box with text. +JCheckBox(text: String, selected: boolean) Creates a check box with text and specifies whether the check box is initially selected. +JCheckBox(icon: Icon) Creates a checkbox with an icon. +JCheckBox(text: String, icon: Icon) Creates a checkbox with text and an icon. +JCheckBox(text: String, icon: Icon, selected: boolean) Creates a check box with text and an icon, and specifies whether the check box is initially selected. Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved. 0136012671 70 Example: Using Check Boxes Add three check boxes named Centered, Bold, and Italic into Example 16.1 to let the user specify whether the message is centered, bold, or italic. ButtonDemo CheckBoxDemo CheckBoxDemo Run Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved. 0136012671 71 JRadioButton Radio buttons are variations of check boxes. They are often used in the group, where only one button is checked at a time. javax.swing.AbstractButton javax.swing.JToggleButton javax.swing.JRadioButton +JRadioButton() Creates a default radio button with no text and icon. +JRadioButton(text: String) Creates a radio button with text. +JRadioButton(text: String, selected: boolean) Creates a radio button with text and specifies whether the radio button is initially selected. +JRadioButton(icon: Icon) Creates a radio button with an icon. +JRadioButton(text: String, icon: Icon) Creates a radio button with text and an icon. +JRadioButton(text: String, icon: Icon, selected: boolean) Creates a radio button with text and an icon, and specifies whether the radio button is initially selected. Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved. 0136012671 72 Grouping Radio Buttons ButtonGroup btg = new ButtonGroup(); btg.add(jrb1); btg.add(jrb2); Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved. 0136012671 73 Example: Using Radio Buttons Add three radio buttons named Red, Green, and Blue into the preceding example to let the user choose the color of the message. ButtonDemo CheckBoxDemo RadioButtonDemo RadioButtonDemo Run Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved. 0136012671 74 JLabel A label is a display area for a short text, an image, or both. 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.JLabel -text: String The label’s text. -icon: javax.swing.Icon The label’s image icon. -horizontalAlignment: int The horizontal alignment of the text and icon on the label. -horizontalTextPosition: int The horizontal text position relative to the icon on the label. -verticalAlignment: int The vertical alignment of the text and icon on the label. -verticalTextPosition: int The vertical text position relative to the icon on the label. -iconTextGap: int The gap between the text and the icon on the label (JDK 1.4). +JLabel() Creates a default label with no text and icon. +JLabel(icon: javax.swing.Icon) Creates a label with an icon. +JLabel(icon: Icon, hAlignment: int) Creates a label with an icon and the specified horizontal alignment. +JLabel(text: String) Creates a label with text. +JLabel(text: String, icon: Icon, hAlignment: int) Creates a label with text, an icon, and the specified horizontal alignment. +JLabel(text: String, hAlignment: int) Creates a label with text and the specified horizontal alignment. Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved. 0136012671 75 JLabel Properties JLabel inherits all the properties from JComponent and has many properties similar to the ones in JButton, such as text, icon, horizontalAlignment, verticalAlignment, horizontalTextPosition, verticalTextPosition, and iconTextGap. Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved. 0136012671 76 Using Labels // Create an image icon from image file ImageIcon icon = new ImageIcon("image/grapes.gif"); // Create a label with text, an icon, // with centered horizontal alignment JLabel jlbl = new JLabel("Grapes", icon, SwingConstants.CENTER); // Set label's text alignment and gap between text and icon jlbl.setHorizontalTextPosition(SwingConstants.CENTER); jlbl.setVerticalTextPosition(SwingConstants.BOTTOM); jlbl.setIconTextGap(5); Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved. 0136012671 77 JTextField A text field is an input area where the user can type in characters. Text fields are useful in that they enable the user to enter in variable data (such as a name or a description). javax.swing.text.JTextComponent The get and set methods for these data fields are provided in the class, but omitted in the UML diagram for brevity. -text: String The text contained in this text component. -editable: boolean Indicates whether this text component is editable (default: true). javax.swing.JTextField -columns: int The number of columns in this text field. -horizontalAlignment: int The horizontal alignment of this text field (default: LEFT). +JTextField() Creates a default empty text field with number of columns set to 0. +JTextField(column: int) Creates an empty text field with specified number of columns. +JTextField(text: String) Creates a text field initialized with the specified text. +JTextField(text: String, columns: int) Creates a text field initialized with the specified text and columns. Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved. 0136012671 78 JTextField Methods getText() Returns the string from the text field. Inherited setText(String text) Puts the given string in the text field. Inherited setEditable(boolean editable) Enables or disables the text field to be edited. By default, editable is true. Inherited setColumns(int) Sets the number of columns in this text field. The length of the text field is changeable. Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved. 0136012671 79 Example: Using Text Fields Add a text field to the preceding example to let the user set a new message. JFrame ButtonDemo CheckBoxDemo TextFieldDemo RadioButtonDemo TextFieldDemo Run Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved. 0136012671 80 JTextArea If you want to let the user enter multiple lines of text, you cannot use text fields unless you create several of them. The solution is to use JTextArea, which enables the user to enter multiple lines of text. javax.swing.text.JTextComponent The get and set methods for these data fields are provided in the class, but omitted in the UML diagram for brevity. javax.swing.JTextArea -columns: int The number of columns in this text area. -rows: int The number of rows in this text area. -tabSize: int The number of characters used to expand tabs (default: 8). -lineWrap: boolean Indicates whether the line in the text area is automatically wrapped (default: false). -wrapStyleWord: boolean Indicates whether the line is wrapped on words or characters (default: false). +JTextArea() Creates a default empty text area. +JTextArea(rows: int, columns: int) Creates an empty text area with the specified number of rows and columns. +JTextArea(text: String) Creates a new text area with the specified text displayed. +JTextArea(text: String, rows: int, columns: int) Creates a new text area with the specified text and number of rows and columns. Appends the string to text in the text area. +append(s: String): void +insert(s: String, pos: int): void Inserts string s in the specified position in the text area. +replaceRange(s: String, start: int, end: int): void Replaces partial text in the range from position start to end with string s. +getLineCount(): int Returns the actual number of lines contained in the text area. Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved. 0136012671 81 Example: Using Text Areas This example gives a program that displays an image in a label, a title in a label, and a text in a text area. JPanel JFrame -char token +getToken DescriptionPanel +setToken +paintComponet -jlblImage: JLabel +mouseClicked -jtaTextDescription: JTextArea -char token 1 1 +getToken TextAreaDemo +setToken +paintComponet +mouseClicked +setImageIcon(icon: ImageIcon): void +setTitle(title: String): void +setTextDescription(text: String): void +getMinimumSize(): Dimension Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved. 0136012671 82 Example, cont. TextAreaDemo Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved. 0136012671 Run 83 JComboBox A combo box is a simple list of items from which the user can choose. It performs basically the same function as a list, but can get only one value. javax.swing.JComponent javax.swing.JComboBox +JComboBox() Creates a default empty combo box. +JComboBox(items: Object[]) Creates a combo box that contains the elements in the specified array. +addItem(item: Object): void Adds an item to the combo box. +getItemAt(index: int): Object Returns the item at the specified index. +getItemCount(): int Returns the number of items in the combo box. +getSelectedIndex(): int Returns the index of the selected item. +setSelectedIndex(index: int): void Sets the selected index in the combo box. +getSelectedItem(): Object Returns the selected item. +setSelectedItem(item: Object): void Sets the selected item in the combo box. +removeItem(anObject: Object): void Removes an item from the item list. Removes the item at the specified index in the combo box. +removeItemAt(anIndex: int): void +removeAllItems(): void Removes all items in the combo box. Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved. 0136012671 84 JComboBox Methods To add an item to a JComboBox jcbo, use jcbo.addItem(Object item) To get an item from JComboBox jcbo, use jcbo.getItem() Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved. 0136012671 85 Using the itemStateChanged Handler When a choice is checked or unchecked, itemStateChanged() for ItemEvent is invoked as well as the actionPerformed() handler for ActionEvent. public void itemStateChanged(ItemEvent e) { // Make sure the source is a combo box if (e.getSource() instanceof JComboBox) String s = (String)e.getItem(); } Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved. 0136012671 86 Example: Using Combo Boxes This example lets users view an image and a description of a country's flag by selecting the country from a combo box. ComboBoxDemo Run Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved. 0136012671 87 JList A list is a component that performs basically the same function as a combo box, but it enables the user to choose a single value or multiple values. javax.swing.JComponent javax.swing.JList +JList() Creates a default empty list. +JList(items: Object[]) Creates a list that contains the elements in the specified array. +getSelectedIndex(): int Returns the index of the first selected item. +setSelectedIndex(index: int): void Selects the cell at the specified index. +getSelectedIndices(): int[] Returns an array of all of the selected indices in increasing order. +setSelectedIndices(indices: int[]): void Selects the cells at the specified indices. +getSelectedValue(): Object Returns the first selected item in the list. +getSelectedValues(): Object[] Returns an array of the values for the selected cells in increasing index order. +getVisibleRowCount(): int Returns the number of visible rows displayed without a scrollbar. (default: 8) +setVisibleRowCount(count: int): void Sets the preferred number of visible rows displayed without a scrollbar. +getSelectionBackground(): Color Returns the background color of the selected cells. +setSelectionBackground(c: Color): void Sets the background color of the selected cells. +getSelectionForeground(): Color Returns the foreground color of the selected cells. +setSelectionForeground(c: Color): void Sets the foreground color of the selected cells. +getSelectionMode(): int Returns the selection mode for the list. +setSelectionMode(selectionMode: int): Sets the selection mode for the list. Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved. 0136012671 88 Example: Using Lists This example gives a program that lets users select countries in a list and display the flags of the selected countries in the labels. ListDemo Run Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved. 0136012671 89 JScrollBar A scroll bar is a control that enables the user to select from a range of values. The scrollbar appears in two styles: horizontal and vertical. 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.JScrollBar -orientation: int Specifies horizontal or vertical style, default is horizontal. -maximum: int Specifies the maximum value the scroll bar represents when the bubble reaches the right end of the scroll bar for horizontal style or the bottom of the scroll bar for vertical style. -minimum: int Specifies the minimum value the scroll bar represents when the bubble reaches the left end of the scroll bar for horizontal style or the top of the scroll bar for vertical style. -visibleAmount: int Specifies the relative width of the scroll bar's bubble. The actual width appearing on the screen is determined by the maximum value and the value of visibleAmount. -value: int Represents the current value of the scroll bar. -blockIncrement: int Specifies value added (subtracted) when the user activates the blockincrement (decrement) area of the scroll bar, as shown in Figure 13.30. -unitIncrement: int Specifies the value added (subtracted) when the user activates the unitincrement (decrement) area of the scroll bar, as shown in Figure 13.30. +JScrollBar() Creates a default vertical scroll bar. +JScrollBar(orientation: int) Creates a scroll bar with the specified orientation. +JScrollBar(orientation: int, value: Creates a scrollbar with the specified orientation, value, extent, int, extent: int, min: int, max: int) minimum, and maximum. Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved. 0136012671 90 Scroll Bar Properties Minimal value Maximal value Block decrement Block increment Bubble Unit decrement Unit increment Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved. 0136012671 91 Example: Using Scrollbars This example uses horizontal and vertical scrollbars to control a message displayed on a panel. The horizontal scrollbar is used to move the message to the left or the right, and the vertical scrollbar to move it up and down. ScrollBarDemo Run Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved. 0136012671 92