1052 Series for Graphics Graphics, Applets Graphical User Interfaces 1 CLH GUI slides Outline - Chapter 2 Graphics Applets Drawing Shapes 2 CLH GUI slides Introduction to Graphics The last few sections of each chapter of the textbook focus on graphics and graphical user interfaces A picture or drawing must be digitized for storage on a computer A picture is made up of pixels (picture elements), and each pixel is stored separately The number of pixels used to represent a picture is called the picture resolution The number of pixels that can be displayed by a monitor is called the monitor resolution 3 CLH GUI slides Coordinate Systems Each pixel can be identified using a two-dimensional coordinate system When referring to a pixel in a Java program, we use a coordinate system with the origin in the top-left corner (0, 0) 112 X 40 (112, 40) Y 4 CLH GUI slides The Coordinate System <0, 0> X x y <x, y> Y <width-1, height-1> 5 CLH GUI slides Outline Graphics Applets Drawing Shapes 6 CLH GUI slides Applets A Java application is a stand-alone program with a main method (like the ones we've seen so far) A Java applet is a program that is intended to transported over the Web and executed using a web browser An applet doesn't have a main method Instead, there are several special methods that serve specific purposes 7 CLH GUI slides Applets A applet is typically embedded in a Web page and can be run from a browser. You need a special HTML in the Web page to tell the browser about the applet. 8 CLH GUI slides Applets The class that defines an applet extends the JApplet class An applet is embedded into an HTML file using a tag that references the bytecode version of the applet The bytecode version of the program is transported across the web and executed by a Java interpreter that is part of the browser on the receiving site 9 CLH GUI slides HTML <html> <head> <title> Hi World Applet </title> </head> <body> <applet code="HiWorld.class” width=300 height=200> </applet> </body> </html> 10 CLH GUI slides The HTML applet Tag <html> <head> <title>The Einstein Applet</title> </head> <body> <applet code="Einstein.class" </applet> </body> </html> 11 CLH GUI slides Java Applets local computer Java source code remote computer Java compiler Java bytecode Web browser Java interpreter 12 CLH GUI slides Changing bytecode to machine code When the bytecode is sent to another computer over the web, that computer’s browser will interpret the bytecode with a java compiler on its computer change it to the machine code of that computer. This allows applets to used on both MACS and Windows machines and Unix servers 13 CLH GUI slides Drawing Shapes A shape can be filled or unfilled, depending on which method is invoked The method parameters specify coordinates and sizes Shapes with curves, like an oval, are usually drawn by specifying the shape’s bounding rectangle An arc can be thought of as a section of an oval 14 CLH GUI slides Sample Graphics methods A Graphics context is something you can paint on. g.drawString(“Hello, World”, 20, 20); g.drawRect(x, y, width, height); g.fillRect(x, y, width, height); g.drawOval(x, y, width, height); g.fillOval(x, y, width, height); To set the color that will fill the Oval use: g.setColor(Color.red); 15 CLH GUI slides Drawing a Line 10 150 X 20 45 Y page.drawLine (10, 20, 150, 45); or page.drawLine (150, 45, 10, 20); 16 CLH GUI slides Drawing a Rectangle 50 X 20 40 100 Y page.drawRect (50, 20, 100, 40); Where 50,20 are the x and y values where The rectangle will start 100 is the width 40 is the length 17 CLH GUI slides Drawing an Oval 175 X 20 80 bounding rectangle Y 50 page.drawOval (175, 20, 50, 80); We give values for the bounding rectangle – Start the left side of oval at 175,20 18 CLH GUI slides public class No_Parking extends applet { { public void paintComponent (Graphics page) page.drawString (Parking”, 50, 50); page.drawOval (45, 24, 43, 43); page.drawLine (82, 30, 51,61); } //method paintComponent } // class No_Parking Appletviewer : No_Parking Class Parking Applet Started 19 CLH GUI slides Drawing Shapes Every drawing surface has a background color Every graphics context has a current foreground color Both can be set explicitly See Snowman.java (page103) 20 CLH GUI slides Representing Color A black and white picture could be stored using one bit per pixel (0 = white and 1 = black) A colored picture requires more information; there are several techniques for representing colors For example, every color can be represented as a mixture of the three additive primary colors Red, Green, and Blue Each color is represented by three numbers between 0 and 255 that collectively are called an RGB value 21 CLH GUI slides The Color Class A color in a Java program is represented as an object created from the Color class The Color class also contains several predefined colors, including the following: Object RGB Value Color.black Color.blue Color.cyan Color.orange Color.white Color.yellow 0, 0, 0 0, 0, 255 0, 255, 255 255, 200, 0 255, 255, 255 255, 255, 0 22 CLH GUI slides public class Snowman extends JApplet { public void paintComponent (Graphics page) { final int MID = 150; final int TOP = 50; setBackground (Color.cyan); page.setColor (Color.blue); page.fillRect (0, 175, 300, 50); // ground page.setColor (Color.yellow); page.fillOval (-40, -40, 80, 80); // sun page.setColor (Color.white); page.fillOval (MID-20, TOP, 40, 40); // head page.fillOval (MID-35, TOP+35, 70, 50); // upper torso page.fillOval (MID-50, TOP+80, 100, 60); // lower torso 23 CLH GUI slides page.setColor (Color.black); page.fillOval (MID-10, TOP+10, 5, 5); // left eye page.fillOval (MID+5, TOP+10, 5, 5); // right eye page.drawArc (MID-10, TOP+20, 20, 10, 190, 160); // smile page.drawLine (MID-25, TOP+60, MID-50, TOP+40); // left arm page.drawLine (MID+25, TOP+60, MID+55, TOP+60); // right arm page.drawLine (MID-20, TOP+5, MID+20, TOP+5); page.fillRect (MID-15, TOP-20, 30, 25); // brim of hat // top of hat } } 24 CLH GUI slides Snowman Applet 25 CLH GUI slides Applet methods public void init () public void start () public void stop () public void destroy () public void paint (Graphics g) 26 CLH GUI slides The paint method is executed automatically when the applet is loaded The paint method accepts a parameter that is an object of the Graphics class. It is used to draw shapes and text e.g page.drawRect(x, y, width, width) 27 CLH GUI slides Why an applet works You write an applet by extending the class JApplet. 28 CLH GUI slides public void init ( ) Invoked when the applet is first loaded and again if the applet is reloaded. This is the first method to execute It is an ideal place to initialize variables It is the best place to define and use buttons, text fields, sliders, layouts, etc. Even if you do not use it, it is called anyway 29 CLH GUI slides The init() Method Other Common functions implemented in this method are: creating threads, loading images, reading images from a file. Init is similar to a constructor in an application 30 CLH GUI slides public void start ( ) Not always needed Automocatically called after init( ) Called each time the page is loaded and restarted.e.g. after a user leaves and goes to another web page. Used mostly in conjunction with stop( ) 31 CLH GUI slides public void stop( ) Not always needed. Used mostly in conjunction with start(). Called when the browser leaves the page - invoked when the user moves off the page. Use stop( ) if the applet is doing heavy computation that you don’t want to continue when the browser is on some other page. When the user leaves the page, any threads the applet has started—but not completed—will continue to run if stop is not called. 32 CLH GUI slides public void destroy( ) Seldom needed Called after stop( ) Use to explicitly release system resources (like threads) System resources are usually released automatically 33 CLH GUI slides Applet flow of control init( ) start( ) do some work stop( ) destroy( ) 34 CLH GUI slides Browser Calling Applet Methods reload enters web page init after init return to the page start exit CLH GUI slides stop leave the page destroy 35 public void paint(Graphics g) Do drawing here. WE call fillboard () and other methods in paint. If you want to repaint some image: Don’t call this paint directly. It’s called automatically. Call repaint( ) instead. 36 CLH GUI slides repaint( ) Call repaint( ) when you have changed something and want your changes to show up on the screen repaint( ) is a request--it might not happen. 37 CLH GUI slides Applets are not magic! Anything you can do in an applet, you can do in an application. You can do some things in an application that you can’t do easily if at al in an applet such as writing to a file. 38 CLH GUI slides Graphical User Interfaces - GUI’s A GUI in Java is created with at least three kinds of objects: Components - textfields, buttons Events - a button is pressed Listeners - react to the event 39 CLH GUI slides Graphical Applications These components will serve as a foundation for programs that USE graphical user interfaces (GUIs) 40 CLH GUI slides GUI Components A GUI component is an object that represents a screen element such as a button or a text field 41 CLH GUI slides GUI Containers A GUI is a container that is used to hold and organize other components e.g. Containers include: Panels Frames dialog boxes 42 CLH GUI slides A Container holding components 43 Containers A frame is a container that is used to display a GUI-based Java application A frame is displayed as a separate window with a title bar – it can be repositioned and resized on the screen as needed 44 CLH GUI slides THE FRAME HOLDS THE PANEL OF IMAGES AND DISPLAYS THE NAME OF THE PROGRAM 45 CLH GUI slides Containers and Components A GUI container can be classified as either heavyweight or lightweight A lightweight container is managed by the Java program itself A frame is a heavyweight container and a panel is a lightweight container 46 CLH GUI slides GUI Development Therefore, to create a Java program that uses a GUI we must: instantiate and set up the necessary components implement listener classes for any events we set up. establish the relationship between listeners and components 47 CLH GUI slides Some types of components 48 CLH GUI slides Swing Components There are various Swing GUI components that we can incorporate into our software: labels (including images) text fields and text areas buttons check boxes radio buttons menus combo boxes and many more… 49 CLH GUI slides Creating components JLabel lab = new Label (”Hi, Dave!"); JButton but = new Button ("Click me!"); JCheckbox toggle = new Checkbox (”toggle"); JTextField txt = new JTextField (”Initial text.", 20); JScrollbar scrolly = new Scrollbar (Scrollbar.HORIZONTAL, initialValue, bubbleSize, minValue, maxValue); 50 CLH GUI slides Labels A label is a GUI component that displays a line of text Labels are used to display information or identify other components in the interface Let's look at a program that organizes three labels in a panel and displays that panel in a frame 51 A LABEL WITH IMAGES AND TEXT 52 CLH GUI slides Labels and Image Icons A label is used to provide information to the user or to add decoration to the GUI It can incorporate an image defined by the ImageIcon class 53 CLH GUI slides Image Icons An Imageicon object represents an image ImageIcon are either JPEG or GIF images A JLabel can contain a String, or ImageIcon, or both The orientation of the label's text and image can be set explicitly 54 CLH GUI slides The LabelDemo Program 55 CLH GUI slides public class LabelDemo { //-------------------------------------------------- // Creates and displays three labels //--------------------------------------------public static void main (String[] args) { ImageIcon icon = new ImageIcon ("devil.gif"); // 3 LABELS of class Jlabel JLabel label1, label2, label3; // put label in the middle of A panel label1 = new JLabel ("Devil Left", icon, SwingConstants.CENTER); 56 label2 = new JLabel ("Devil Right", icon, SwingConstants.CENTER); label2.setHorizontalTextPosition (SwingConstants.LEFT); label2.setVerticalTextPosition (SwingConstants.BOTTOM); label3 = new JLabel ("Devil Above", icon, SwingConstants.CENTER); label3.setHorizontalTextPosition (SwingConstants.CENTER); label3.setVerticalTextPosition (SwingConstants.BOTTOM); 57 //Create a Panel and put the three labels on it JPanel panel = new JPanel(); // HOLDS THE LABELS panel.setBackground (Color.cyan); panel.setPreferredSize (new Dimension (200, 250)); panel.add (label1); // ADD EACH LABEL TO THE PANEL panel.add (label2); panel.add (label3); // get the container to put the panel on Container c = getContentPane(); c.add(panel); // add the panel to the CONTAINER } CLH GUI slides 58 The LabelDemo Program 59 CLH GUI slides GUI Elements - Events An event is an object that represents some interaction with the user. E.g. pressing a button in Dating Service selecting an option from checkbox 60 CLH GUI slides Events • we may want our program to perform some action when the following occurs: – the mouse is moved – a mouse button is clicked – the mouse is dragged – a graphical button is clicked – a keyboard key is pressed – a timer expires 61 CLH GUI slides Making components active Most components appear to do something— buttons click, text appears To associate an particular action with a component, we attach a listener to it 62 CLH GUI slides Buttons fire events Components fire events, e.g. a button is pressed listeners listen for events 63 CLH GUI slides Listeners Different components may fire different events, and require different listeners A listener is an object that is “waiting for an event to occur” and we code what we want it to do when an event occurs 64 CLH GUI slides Listeners Listeners are interfaces, the class below implements The ActionListener interface class ButtonListener implements ActionListener ActionListener Interface with one method: public void ActionPerformed(Event e); 65 CLH GUI slides Events and Listeners Event Generator Listener This object may generate an event This object waits for, and responds to an event When an event occurs, the the appropriate method of the listener is called, passing an object that describes the event 66 CLH GUI slides Creating GUIs - Review Therefore, to create a program with a GUI, we : define and set up the components create listener classes set up the relationships between the listeners and the components which generate events define what happens in response to each event 67 CLH GUI slides Listener class for buttons The listener class must implement the ActionListener Interface. A method is called in the listener class to respond: public void actionPerformed(Event e) 68 CLH GUI slides PushButton applet 69 CLH GUI slides Push Counter Example The components of the PushCounter class are the button which the user presses a label to display the counter, a panel to organize the components, and the main frame to hold the GUI 70 CLH GUI slides public class PushCounter extends JApplet { private int pushes; // set up components private JLabel label; private JButton push; //-----------------------------------------------------------// Now set up the GUI. //------------------------------------------------------------ CLH GUI slides 71 public void init () { pushes = 0; push = new JButton ("Push Me!");// create a button // add the ButtonListener class as the listener for the //button push.addActionListener (new ButtonListener()); label = new JLabel ("Pushes: " + Integer.toString (pushes)); Container cp = getContentPane();// cp holds the components cp.add (push); // add the button to contentPane cp.add (label); } // add the label 72 CLH GUI slides 73 CLH GUI slides /****************************************** // Class BUTTONLISTENER listens for when the Jbutton is pressed AND implements the ActionListener Interface //****************************************** private class ButtonListener implements ActionListener { //---------------------------------------------------------- // Updates the counter when the button is pushed. // and changes the number of pushed on the label //---------------------------------------------------------- public void actionPerformed (ActionEvent event) { pushes++; label.setText("Pushes: " + pushes); repaint (); // tell layout manager to redraw label } }} //repaint forces an update to change the label CLH GUI slides 74 Listeners - Reviewing the Code // CREATE THE BUTTON push = new JButton ("Push Me!"); // ADD A LISTENER TO IT - ButtonListener push.addActionListener (new ButtonListener()); The ButtonListener class is listed as the listener for for the push buttons - (whenever the button is pressed). 75 CLH GUI slides Push Counter Algorithm When the user presses the button, An event is fired: An an ActionEvent object created AND The program looks for the actionPerformed method in the ButtonListener class The actionPerformed method increments the counter and resets the text of the label 76 CLH GUI slides Push Counter Example The ButtonListener class is implemented as an inner class This allows the listener class to have access to the instance variables and methods in the outer class 77 CLH GUI slides Action Events Some components have more than one listener (just to keep things real simple!!!!!) A list of the Components and their listeners can be found on either Oracle of Sun’s website. 78 CLH GUI slides Nested Panels Containers that contain other components make up the containment hierarchy This hierarchy can be as intricate as needed to create the visual effect desired The following example nests two panels inside a third panel – note the effect this has as the frame is resized 79 CLH GUI slides Nested Panels 80 CLH GUI slides public class NestedPanels { //----------------------------------------------------------------- // Presents two colored panels nested within a third. //----------------------------------------------------------------- public static void main (String[] args) { // Set up first subpanel JPanel subPanel1 = new JPanel(); // set its preferred size and background color subPanel1.setPreferredSize (new Dimension(150, 100)); subPanel1.setBackground (Color.green); 81 CLH GUI slides // create and add another label to a panel JLabel label1 = new JLabel ("One"); subPanel1.add (label1); // Set up second subpanel and size it JPanel subPanel2 = new JPanel(); subPanel2.setPreferredSize (new Dimension(150, 100)); subPanel2.setBackground (Color.red); // create another label and add to panel 2 JLabel label2 = new JLabel ("Two"); subPanel2.add (label2); 82 CLH GUI slides // Set up primary panel JPanel primary = new JPanel(); primary.setBackground (Color.blue); // add the two panels to the primary panel primary.add (subPanel1); primary.add (subPanel2); // add the primary panel to the contentPane getContentPane().add(primary); } CLH GUI slides } 83 84 CLH GUI slides Text Fields A text field allows the user to enter one line of input If the cursor is in the text field, the text field generates an action event when the enter key is pressed 85 CLH GUI slides See Farhenheit.doc 86 CLH GUI slides Fahrenheit.java public class Fahrenheit { //----------------------------------------------------------------- // Creates and displays the temperature converter GUI. //----------------------------------------------------------------public static void main (String[] args) { final JFrame jFrame = new FahrenheitGUI()); // Main frame jFrame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); jFrame.pack(); jFrame.setSize(WINDOW_WIDTH,WINDOW_HEIGHT); jFrame.setVisible(true); } } 87 // Demonstrates the use of JFrame and JTextArea GUI components. //***************************************** public class FahrenheitGUI extends JFrame { private int WIDTH = 300; private int HEIGHT = 75; private JPanel panel; // create a panel // create two labels and a textfield private JLabel inputLabel, outputLabel, resultLabel; private JTextField fahrenheit; 88 CLH GUI slides // Sets up the GUI. public FahrenheitGUI() // create the labels { super("Farhrenheit Converter"); // Create three labels inputLabel = new JLabel ("Enter Fahrenheit temperature:"); outputLabel = new JLabel ("Temperature in Celcius: "); resultLabel = new JLabel ("---"); 89 CLH GUI slides // create a textfield with 10 columns, 20 rows fahrenheit = new JTextField (10, 20); // add a listener classt o the textfield fahrenheit.addActionListener (new TempListener()); // when enter is pressed in the textfield, an event is //fired // Create a panel to put the components on panel = new JPanel(); 90 CLH GUI slides // set the background color of the panel panel.setBackground (Color.yellow); // Add the labels and the textfield to the panel panel.add (inputLabel); // add label panel.add (fahrenheit); // add textfield panel.add (outputLabel); //label panel.add (resultLabel); // Get the contentPane and add the panel to it Container c = getContentPane(); c.add (panel); // add the panel to the GUI 91 CLH GUI slides 92 CLH GUI slides The Farenheit Program The order in which the labels and text fields are added is the order in how they appear. The size of the panels determines how they line up to each other. Panels by default are governed by a flow layout which we will explore later. 93 CLH GUI slides The fahrenheit Program The program reacts when the user presses the enter key inside the text field. A JTextField objects generates an action event when the enter key is pressed The TempListener class will handle the action event when key is pressed . It LISTENS FOR the event 94 CLH GUI slides // when the enter key is pressed in the text field. private class TempListener implements ActionListener { public void actionPerformed (ActionEvent event) { int fahrenheitTemp, celciusTemp; // get the text the user entered into the textfield String text = fahrenheit.getText(); // change the text to an int and store it in celciusTemp fahrenheitTemp = Integer.parseInt (text); celciusTemp = (fahrenheitTemp-32) * 5/9; 95 CLH GUI slides // change the text to an int and store it in celciusTemp fahrenheitTemp = Integer.parseInt (text); celciusTemp = (fahrenheitTemp-32) * 5/9; // change the text in the resultLabel resultLabel.setText (Integer.toString (celciusTemp)); } // end of method 96 CLH GUI slides SetText,() getText() In the above code, setText(some value) will change what is printed on the label. To get a value from a textfield use: String text = fahrenheit.getText(); 97 CLH GUI slides Listeners for TextFields A JTextField has two listeners, ActionListener and TextListener: An ActionListener listens for hitting the return key use getText( ) to get the text from whatever is input into the textfield. 98 CLH GUI slides Determining Event Sources The other listener – TextListener - listens for changes to the text already in the textfield The TextListener Interface has one method public void textValueChanged(TextEvent e) 99 CLH GUI slides What Event? The source of the event ( which component was fired e.g a textfield, a button) can be determined by using the: getSource() method e.g. event.getSource() “event” is the parameter sent to the ActionPerformed method e.g. public void actionPerformed (ActionEvent event) 100 CLH GUI slides public class LeftRight { //----------------------------------------------------------------// Creates the main program frame. //----------------------------------------------------------------public static void main (String[] args) { JFrame frame = new JFrame ("Left Right"); frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); frame.getContentPane().add(new LeftRightPanel()); frame.pack(); frame.setVisible(true); } } 101 CLH GUI slides // Puts a Panel on top of a Panel public class LeftRightPanel extends JPanel { // creates components for the Panel private JButton left, right; private JLabel label; private JPanel buttonPanel; 102 CLH GUI slides Listeners public LeftRightPanel () { // create two buttons left = new JButton ("Left"); right = new JButton ("Right"); // attach listener class to them - same listener for both ButtonListener listener = new ButtonListener(); left.addActionListener (listener); right.addActionListener (listener); label = new JLabel ("Push a button"); // create a label 103 CLH GUI slides 104 CLH GUI slides buttonPanel = new JPanel(); // create a panel buttonPanel.setPreferredSize (new Dimension(200, 40)); buttonPanel.setBackground (Color.blue); buttonPanel.add (left); // add buttons to panel buttonPanel.add (right); setPreferredSize (new Dimension(200, 80)); setBackground (Color.cyan); // add the label and the panel to the LeftRightPanel add (label); add (buttonPanel); } 105 //**************************************************** // Class Represents a listener for both buttons. //**************************************************** private class ButtonListener implements ActionListener { //-------------------------------------------------------------// Determines which button was pressed and sets the label // text accordingly. The event object knows what button was pressed //-------------------------------------------------------------public void actionPerformed (ActionEvent event) { if (event.getSource() == left) // which event was fired? label.setText("Left"); // write left on the label else label.setText("Right"); } } 106 Layout Managers A layout manager is an object that determines the way that components are arranged in a container There are several predefined layout managers defined in the Java standard class library: Flow Layout Border Layout Card Layout Grid Layout GridBag Layout Box Layout Overlay Layout Defined in the AWT Defined in Swing 107 CLH GUI slides Layout Managers We can explicitly set the layout manager Each layout manager has its own particular rules on how the components will be arranged Some layout managers pay attention to a component's preferred size or alignment, while others do not 108 CLH GUI slides Layout Managers We can use the setLayout method of a container to change its layout manager JPanel panel = new JPanel(); panel.setLayout (new BorderLayout()); The following example uses a tabbed pane, a container which permits one of several panes to be selected 109 CLH GUI slides FlowLayout Components are added left-to-right If no room is left , a new row is started Exact layout depends on size of the container Components are made as small as possible FlowLayout is convenient but often ugly 110 CLH GUI slides Flow Layout Flow layout puts as many components as possible on in a row, and then moves to the next row Each row of components is centered horizontally in the window by default, but could also be aligned left or right The horizontal and vertical gaps between the components can be explicitly set also CLH GUI slides 111 public class FlowPanel extends JPanel { //----------------------------------------------------------------// Sets up this panel with some buttons to show how flow layout affects their position. //----------------------------------------------------------------public FlowPanel () { setLayout (new FlowLayout()); setBackground (Color.green); // create 5 buttons JButton b1 = new JButton ("BUTTON 1"); JButton b2 = new JButton ("BUTTON 2"); JButton b3 = new JButton ("BUTTON 3"); JButton b4 = new JButton ("BUTTON 4"); JButton b5 = new JButton ("BUTTON 5"); } } slides CLH GUI 112 Adding the buttons to the panel Now add all the buttons to the panel add (b1); add (b2); add (b3); add (b4); add (b5); Because FlowPanel extend Jpanel, we add the buttons directly to it. 113 CLH GUI slides LayoutDemo - Flow 114 CLH GUI slides Border Layout A border layout defines five areas to which components can be added West North Center East South 115 CLH GUI slides BorderLayout At most five components can be added If you want more components, add a Panel, then add components to it. setLayout (new BorderLayout()); add (BorderLayout.NORTH, new Button(“NORTH”)); 116 CLH GUI slides BorderLayout with five Buttons The code to add 4 buttons to a GUI public void init() { setLayout (new BorderLayout ()); } add (BorderLayout.NORTH, new Button ("NORTH")); add (BorderLayout.SOUTH, new Button ("SOUTH")); add (BorderLayout.EAST, new Button ("EAST")); add (BorderLayout.WEST, new Button ("WEST")); add (BorderLayout.CENTER, new Button ("CENTER")); 117 CLH GUI slides Using a Panel within a panel panel p = new Panel(); // create another panel add (BorderLayout.SOUTH, p);// set its layout p.add (new Button (“Button 1”)); //add buttons to it p.add (new Button (“Button 2”)); 118 CLH GUI slides Border Layout Each area displays one component (which could be another container such as a JPanel) Each of the four outer areas enlarges as needed to accommodate the component added to it If nothing is added to the outer areas, they take up no space and other areas expand to fill the void The center area expands to fill space as needed 119 CLH GUI slides LayoutDemo - Border 120 CLH GUI slides Grid Layout A grid layout presents a container’s components in a rectangular grid of rows and columns One component is placed in each cell of the grid, and all cells have the same size 121 CLH GUI slides Grid Layout As components are added to the container, they fill the grid from left-to-right and top-tobottom (by default) The size of each cell is determined by the overall size of the container 122 CLH GUI slides public class GridPanel extends JPanel { //----------------------------------------------------------------// Sets up this panel with some buttons to show how grid // layout affects their position, shape, and size. //----------------------------------------------------------------- public GridPanel() { setLayout (new GridLayout (2, 3)); // 2 rows, 3 columns setBackground (Color.green); JButton b1 = new JButton ("BUTTON 1"); JButton b2 = new JButton ("BUTTON 2"); JButton b3 = new JButton ("BUTTON 3"); JButton b4 = new JButton ("BUTTON 4"); JButton b5 = new JButton ("BUTTON 5"); } } add (b1); // add all the buttons to the panel add (b2); add (b3); add (b4); add (b5); CLH GUI slides 123 LayoutDemo - Grid 124 CLH GUI slides Box Layout A box layout organizes components horizontally (in one row) or vertically (in one column) Components are placed top-to-bottom or left-to-right in the order in which they are added to the container 125 CLH GUI slides BOX Layout By combining multiple containers using box layout, many different configurations can be created Multiple containers with box layouts are often preferred to one container 126 CLH GUI slides Gridbag layout The Gridbag layout uses the more complicated gridbag layout manager For GRIDBAG layout you place components yourself by Giving the pixel locations of every component 127 CLH GUI slides Box Layout Invisible components can be added to a boxlayout container to take up space between components Rigid areas have a fixed size Glue specifies where excess space should go 128 CLH GUI slides Boxlayout A rigid area is created using the createRigidArea() method of the Box class Glue which allows an area to expand is created using the methods createHorizontalGlue () or createVerticalGlue () 129 CLH GUI slides LayoutDemo - Box 130 CLH GUI slides public class BoxPanel extends Jpanel { //----------------------------------------------------------------// Sets up this panel with some buttons to show how a //vertical box layout (and invisible components) affects //their position. //----------------------------------------------------------------- public BoxPanel() { setLayout (new BoxLayout (this, BoxLayout.Y_AXIS)); setBackground (Color.green); JButton b1 = new JButton ("BUTTON 1"); JButton b2 = new JButton ("BUTTON 2"); JButton b3 = new JButton ("BUTTON 3"); JButton b4 = new JButton ("BUTTON 4"); JButton b5 = new JButton ("BUTTON 5"); CLH GUI slides 131 add (b1); add (Box.createRigidArea (new Dimension (0, 10))); add (b2); add (Box.createVerticalGlue()); add (b3); add (b4); add (Box.createRigidArea (new Dimension (0, 20))); add (b5); } } 132 CLH GUI slides Dialog Boxes A dialog box is a window that appears on top of any currently active window It may be used to: convey information confirm an action allow the user to enter data pick a color choose a file A dialog box usually has a specific, solitary purpose, and the user interaction with it is brief 133 CLH GUI slides Dialog Boxes A dialog box is a graphical window that pops up on top of any currently active window for the user The Swing API contains a class called JOptionPane that simplifies the creation and use of basic dialog boxes 134 CLH GUI slides There are three categories of JOptionPane dialog boxes A message dialog displays an output string An input dialog presents a prompt and a single input text field A confirm dialog presents the user with a simple yes-or-no question 135 CLH GUI slides The EvenOdd Program 136 CLH GUI slides Check Boxes A check box is a button that can be toggled on or off You use the JCheckBox class Unlike a push button, which generates an action event, ( a listener) check box generates an item event whenever it changes state (is checked on or off) 137 CLH GUI slides The ItemListener interface is used to define : item event listeners which are the listeners for checkboxes The check box calls the itemStateChanged() method when it is toggled Just like buttons call actionPerformed() method 138 CLH GUI slides Check Boxes Let's examine a program that uses check boxes to determine the style of a label's text string It uses the Font class, which represents a character’s font: You can specify: family name (such as Times or Courier) style (bold, italic, or both) font size 139 CLH GUI slides Checkbox – choose bold or italic 140 CLH GUI slides public class StyleOptionsPanel extends JPanel { private JLabel saying; // label to place the saying private JCheckBox bold, italic; // two checkboxs //----------------------------------------------------------------// Sets up a panel with a label and some check boxes // and controls the style of the label's font. //----------------------------------------------------------------- 141 //Setting the font for the Jlabel and the checkboxes ************************************************** public StyleOptionsPanel() { saying = new JLabel ("Say it with style!"); saying.setFont (new Font ("Helvetica", Font.PLAIN, 36)); bold = new JCheckBox ("Bold"); bold.setBackground (Color.cyan); italic = new JCheckBox ("Italic"); italic.setBackground (Color.cyan); 142 CLH GUI slides // set up a listener classs for the checkboxes StyleListener listener = new StyleListener(); bold.addItemListener (listener);// add listeners italic.addItemListener (listener); add (saying); // add checkboxes and label add (bold); add (italic); setBackground (Color.cyan); setPreferredSize (new Dimension(300, 100)); 143 Setting up listeners for checkboxes // set up a listener classs for the checkboxes StyleListener listener = new StyleListener(); // add listeners to the checkboxes bold.addItemListener (listener);// add listeners italic.addItemListener (listener); add (saying); // add checkboxes and label to panel add (bold); add (italic); setBackground (Color.cyan); setPreferredSize (new Dimension(300, 100)); 144 CLH GUI slides //**************************************************** // Represents the listener class for both check //*************************************************** box. private class StyleListener implements ItemListener { //-------------------------------------------------------------// Updates the style of the label font style. //-------------------------------------------------------------public void itemStateChanged (ItemEvent event) { int style = Font.PLAIN; if (bold.isSelected()) // if the bold checkbox is selected style = Font.BOLD; // set the style to BOLD if (italic.isSelected()) // if italic checkbox is selected style = Font.ITALIC; // set the style to italic saying.setFont (new Font ("Helvetica", style, 36)); } }} 145 The StyleOptions Program 146 CLH GUI slides Radio Buttons A group of radio buttons represents a set of mutually exclusive options – only one can be selected at any given time When a radio button from a group is selected, the button that is currently "on" in the group is automatically toggled off 147 CLH GUI slides To define the group of radio buttons that will work together, each radio button is added to a ButtonGroup object A radio button generates an action event 148 CLH GUI slides Radio Buttons Compare and contrast check boxes and radio buttons Check boxes work independently to provide a boolean option – do you want skim milk or whole milk? Radio buttons work as a group to provide a set of mutually exclusive options – do you want to hear classical, rock, or country music? 149 CLH GUI slides QuoteOptions Program // Creates and presents the program frame. //----------------------------------------------------------------public static void main (String[] args) { JFrame frame = new JFrame ("Quote Options"); frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); QuoteOptionsPanel panel = new QuoteOptionsPanel(); frame.getContentPane().add (panel); frame.pack(); frame.setVisible(true); } } 150 CLH GUI slides public class QuoteOptionsPanel extends JPanel { private JLabel quote; private JRadioButton comedy, philosophy, carpentry; private String comedyQuote, philosophyQuote, carpentryQuote; // strings to be placed on buttons //----------------------------------------------------------------// Sets up a panel with a label and // a set of radio buttons // that control its text. //----------------------------------------------------------------- 151 CLH GUI slides public QuoteOptionsPanel() { comedyQuote = "Take my wife, please."; philosophyQuote = "I think, therefore I am."; carpentryQuote = "Measure twice. Cut once."; quote = new JLabel (comedyQuote); quote.setFont (new Font ("Helvetica", Font.BOLD, 24)) 152 CLH GUI slides Create three radio buttons comedy = new JRadioButton ("Comedy", true); comedy.setBackground (Color.green); philosophy = new JRadioButton ("Philosophy"); philosophy.setBackground (Color.green); carpentry = new JRadioButton ("Carpentry"); carpentry.setBackground (Color.green); // puts the buttons into a group - this is required ButtonGroup group = new ButtonGroup(); group.add (comedy); group.add (philosophy); group.add (carpentry); 153 CLH GUI slides QuoteOptions.java // see slide 156 first // set up a listener for the buttons QuoteListener listener = new QuoteListener(); comedy.addActionListener (listener); philosophy.addActionListener (listener); carpentry.addActionListener (listener); // Add the buttons to this panel add (quote); add (comedy); add (philosophy); add (carpentry); } setBackground (Color.green); setPreferredSize (new Dimension(300, 100)); CLH GUI slides 154 //******************************************************** // Represents the listener class for all radio buttons /*********************************************************** private class QuoteListener implements ActionListener { } } //-------------------------------------------------------------// Sets the text on the label depending on which radio // button was pressed. //-------------------------------------------------------------public void actionPerformed (ActionEvent event) { if (event.getSource() == comedy // if the comedy button is pressed quote.setText (comedyQuote); else // if the philosophy button is pressed } CLH GUI slides if (event.getSource() == philosophy) quote.setText (philosophyQuote); else quote.setText (carpentryQuote); 155 The QuoteOptions Program 156 CLH GUI slides Combo Boxes A JCombobox displays a particular option with a pull down menu from which the user can choose a different option The currently selected option is shown in the combo box A combo box can be editable, so that the user can type their option directly into the box See JukeBox.java See JukeBoxControls.java 157 CLH GUI slides Combo Boxes Unlike a JList , a combo box shows its options only when the user presses it using the mouse Options can be established using an array of strings or using the addItem method A combo box generates an action event when the user makes a selection from it 158 CLH GUI slides The JukeBox Program See JukeBox.java See JukeBoxControls.java 159 CLH GUI slides //---------------------------------------------------------------// Sets up the GUI for the juke box. // You need to create URL’s to load the sound files //----------------------------------------------------------------public JukeBoxControls() { URL url1, url2, url3, url4, url5, url6; url1 = url2 = url3 = url4 = url5 = url6 = null; // Obtain and store the audio clips to play try { url1 = new URL ("file", "localhost", "westernBeat.wav"); url2 = new URL ("file", "localhost", "classical.wav"); url3 = new URL ("file", "localhost", "jeopardy.au"); url4 = new URL ("file", "localhost", "newAgeRythm.wav"); url5 = new URL ("file", "localhost", "eightiesJam.wav"); url6 = new URL ("file", "localhost", "hitchcock.wav"); } catch (Exception exception) {} } CLH GUI slides 160 // now create an array of AudioClips music = new AudioClip[7]; music[0] = null; // Corresponds to "Make a Selection..." music[1] = JApplet.newAudioClip (url1); music[2] = JApplet.newAudioClip (url2); music[3] = JApplet.newAudioClip (url3); music[4] = JApplet.newAudioClip (url4); music[5] = JApplet.newAudioClip (url5); music[6] = JApplet.newAudioClip (url6); // Create a Jlable and set its alignment Jlabel titleLabel = new JLabel ("Java Juke Box"); titleLabel.setAlignmentX (Component.CENTER_ALIGNMENT); 161 CLH GUI slides // Create the list of strings for the combo box options String[] musicNames = {"Make A Selection...", "Western Beat", "Classical Melody", "Jeopardy Theme", "New Age Rythm", "Eighties Jam", "Alfred Hitchcock's Theme"}; // Create the Combo Box and put the musicnames above in it musicCombo = new JComboBox (musicNames); musicCombo.setAlignmentX (Component.CENTER_ALIGNMENT); // add a listener to the combo box // ComboListener() is the listener class for the combo box musicCombo.addActionListener (new ComboListener()); 162 CLH GUI slides // Set up the buttons playButton = new JButton ("Play", new ImageIcon ("play.gif"))playButton.setBackground (Color.white); playButton.setMnemonic ('p'); stopButton = new JButton ("Stop", new ImageIcon ("stop.gif")); stopButton.setBackground (Color.white); stopButton.setMnemonic ('s'); // keyboard // add action listeners to the buttons stopButton.addActionListener (new ButtonListener()); playButton.addActionListener (new ButtonListener()); current = null; 163 CLH GUI slides JPanel buttons = new JPanel(); // USE A BOXLAYOUT // set the horizontal layout for the buttons panel to BoxLayout buttons.setLayout (new BoxLayout (buttons, BoxLayout.X_AXIS)) // ADD THE BUTTONS buttons.add (playButton); buttons.add (Box.createRigidArea (new Dimension(5,0))); buttons.add (stopButton); buttons.setBackground (Color.cyan); setPreferredSize (new Dimension (300, 100)); setBackground (Color.cyan); 164 CLH GUI slides Set up a Box Layout setLayout (new BoxLayout (this, BoxLayout.Y_AXIS)); // put in a rigid area of 5 pixels add (Box.createRigidArea (new Dimension(0,5))); add (titleLabel); // put in a rigid area of 5 pixels add (Box.createRigidArea (new Dimension(0,5))); add (musicCombo); // put in a rigid area of 5 pixels add (Box.createRigidArea (new Dimension(0,5))); add (buttons); add (Box.createRigidArea (new Dimension(0,5))); 165 CLH GUI slides Listener for the Combo Boxes private class ComboListener implements ActionListener { //-------------------------------------------------------------// Stops playing the current selection (if any) and resets // the current selection to the new one chosen. //-------------------------------------------------------------- public void actionPerformed (ActionEvent event) { if (current != null) current.stop(); // stores the selected music from the combo box in current current = music[musicCombo.getSelectedIndex()]; } } 166 CLH GUI slides //***************************************************************** // Represents the action listener for both control buttons. //***************************************************************** private class ButtonListener implements ActionListener { // //-------------------------------------------------------------// Stops the current selection (if any) . // If the play button was pressed, start playing it again. //-------------------------------------------------------------- public void actionPerformed (ActionEvent event) { if (current != null) current.stop(); } if (event.getSource() == playButton) if (current != null) current.play(); } 167 CLH GUI slides Class JukeBox public class JukeBox { //----------------------------------------------------------------// Creates and displays the JukeBoxControls frame. //----------------------------------------------------------------public static void main (String[] args) { JukeBoxControls frame = new JukeBoxControls(); frame.addWindowListener (new GenericWindowListener()); frame.show(); } } 168 CLH GUI slides Outline Mouse Events and Key Events 169 CLH GUI slides Mouse Events Events related to the mouse are separated into mouse events and mouse motion events Mouse Events: mouse pressed the mouse button is pressed down mouse released the mouse button is released mouse clicked the mouse button is pressed down and released without moving the mouse in between mouse entered the mouse pointer is moved onto (over) a component mouse exited the mouse pointer is moved off of a component 170 CLH GUI slides Mouse Events Mouse Motion Events: mouse moved the mouse is moved mouse dragged the mouse is moved while the mouse button is pressed down Listeners for mouse events are created using the MouseListener and MouseMotionListener interfaces A MouseEvent object is passed to the appropriate method when a mouse event occurs 171 CLH GUI slides The Dots Program 172 CLH GUI slides Mouse Events For a given program, we may only care about one or two mouse events To satisfy the implementation of a listener interface, empty methods must be provided for unused events See Dots.java (page 413) Lewis Book See DotsPanel.java (page 414) 173 CLH GUI slides Extending Event Adapter Classes Creating listener classes by implementing a particular interface (such as MouseListener interface) is not the only way. A listener can also be created by extending a special adapter class of the Java class library Each listener interface has a corresponding adapter class (such as the MouseAdapter class) Each adapter class implements the corresponding listener and provides empty method definitions 174 CLH GUI slides Event Adapter Classes Each adapter class implements the corresponding listener and provides empty method definitions When you derive a listener class from an adapter class, you only need to override the event methods that pertain to the program Empty definitions for unused event methods do not need to be defined because they are provided via inheritance 175 CLH GUI slides public class OffCenter { //----------------------------------------------------------------// Creates the main frame of the program. //----------------------------------------------------------------public static void main (String[] args) { JFrame frame = new JFrame ("Off Center"); frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); frame.getContentPane().add(new OffCenterPanel()); frame.pack(); frame.setVisible(true); } } 176 CLH GUI slides public class OffCenterPanel extends JPanel { private final int WIDTH=300, HEIGHT=300; private DecimalFormat fmt; private Point current; private int centerX, centerY; private double length; //----------------------------------------------------------------public OffCenterPanel() { addMouseListener (new OffCenterListener()); centerX = WIDTH / 2; centerY = HEIGHT / 2; fmt = new DecimalFormat ("0.##"); setPreferredSize (new Dimension(WIDTH, HEIGHT)); setBackground (Color.yellow); } 177 CLH GUI slides //----------------------------------------------------------------// Draws a line from the mouse pointer to the center point of // the applet and displays the distance. //----------------------------------------------------------------public void paintComponent (Graphics page) { super.paintComponent (page); page.setColor (Color.black); page.drawOval (centerX-3, centerY-3, 6, 6); if (current != null) { page.drawLine (current.x, current.y, centerX, centerY); page.drawString ("Distance: " + fmt.format(length), 10, 15); } } 178 CLH GUI slides //***************************************************************** // Represents the listener for mouse events. Demonstrates the // ability to extend an adaptor class. //***************************************************************** private class OffCenterListener extends MouseAdapter { //-------------------------------------------------------------// Computes the distance from the mouse pointer to the center // point of the applet. //-------------------------------------------------------------public void mouseClicked (MouseEvent event) { current = event.getPoint(); length = Math.sqrt(Math.pow((current.x-centerX), 2) + Math.pow((current.y-centerY), 2)); repaint(); } 179 CLH GUI slides The user clicks on a point on panel and distance is calculated 180 CLH GUI slides Key Events A key event is generated when the user types on the keyboard key pressed a key on the keyboard is pressed down key released a key on the keyboard is released key typed a key on the keyboard is pressed down and released Listeners for key events are created by implementing the KeyListener interface A KeyEvent object is passed to the appropriate method when a key event occurs 181 CLH GUI slides Key Events The component that generates a key event is the one that has the current keyboard focus Constants in the KeyEvent class can be used to determine which key was pressed The following example "moves" an image of an arrow as the user types the keyboard arrow keys 182 CLH GUI slides public class Direction { //----------------------------------------------------------------// Creates and displays the application frame. //----------------------------------------------------------------public static void main (String[] args) { JFrame frame = new JFrame ("Direction"); frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); frame.getContentPane().add (new DirectionPanel()); frame.pack(); frame.setVisible(true); } } 183 CLH GUI slides The Direction Program 184 CLH GUI slides import javax.swing.*; import java.awt.*; import java.awt.event.*; public class DirectionPanel extends JPanel { private final int WIDTH = 300, HEIGHT = 200; private final int JUMP = 10; // increment for image movement private final int IMAGE_SIZE = 31; private ImageIcon up, down, right, left, currentImage; private int x, y; //---------------------------------------------------------- 185 CLH GUI slides //----------------------------------------------------------------// Constructor: Sets up this panel and loads the images. //----------------------------------------------------------------public DirectionPanel() { addKeyListener (new DirectionListener()); x = WIDTH / 2; y = HEIGHT / 2; up = new ImageIcon ("arrowUp.gif"); down = new ImageIcon ("arrowDown.gif"); left = new ImageIcon ("arrowLeft.gif"); right = new ImageIcon ("arrowRight.gif"); currentImage = right; setBackground (Color.black); setPreferredSize (new Dimension(WIDTH, HEIGHT)); setFocusable(true); } 186 CLH GUI slides //--------------------------------------------------------// Draws the image in the current location. //-----------------------------------------------------public void paintComponent (Graphics page) { super.paintComponent (page); currentImage.paintIcon (this, page, x, y); } // close class The paintIcon method draws the current image at the specified x and y location 187 CLH GUI slides //***************************************************************** // Represents the listener for keyboard activity. //***************************************************************** private class DirectionListener implements KeyListener { //-------------------------------------------------------------// Responds to the user pressing arrow keys by adjusting the // image and image location accordingly using //-------------------------------------------------------------public void keyPressed (KeyEvent event) { switch (event.getKeyCode()) { case KeyEvent.VK_UP: currentImage = up; y -= JUMP; break; case KeyEvent.VK_DOWN: currentImage = down; y += JUMP; break; 188 CLH GUI slides case KeyEvent.VK_LEFT: currentImage = left; x -= JUMP; break; case KeyEvent.VK_RIGHT: currentImage = right; x += JUMP; break; } repaint(); } //-------------------------------------------------------------// Provide empty definitions for unused event methods. // Had the listener implement KeyAdaptor – this would not be necessary //-------------------------------------------------------------public void keyTyped (KeyEvent event) {} public void keyReleased (KeyEvent event) {} } } 189 CLH GUI slides Some of the methods available on KeyEvents: Method Purpose int getKeyChar() Obtains the Unicode character associated with this event. Only rely on this value for key-typed events. int getKeyCode() Obtains the key code associated with this event. The key code identifies the particular key on the keyboard that the user pressed or released. The KeyEvent class defines many key code constants for commonly seen keys. For example, VK_A specifies the key labeled A, and VK_ESCAPE specifies the Escape key. CLH GUI slides 190 KeyEvents See this site for examples of all key events: http://download.oracle.com/javase/1.4.2/docs/api/java/a wt/event/KeyEvent.html 191 CLH GUI slides The Timer Class The Timer class of the javax.swing package is a GUI component, but it has no visual representation A Timer object generates an action event at specified intervals Timers can be used to manage any events that are based on a timed interval, such as an animation To create the illusion of movement, we use a timer to change the scene after an timed delay 192 CLH GUI slides The Timer Class The start and stop methods of the Timer class start and stop the timer The delay can be set using the Timer constructor or using the setDelay method 193 CLH GUI slides Animations An animation is a constantly changing series of pictures or images that create the illusion of movement We can create animations in Java by changing a picture slightly over time The speed of a Java animation is usually controlled by a Timer object 194 CLH GUI slides The Rebound Program 195 CLH GUI slides Animations A Timer object generates and ActionEvent every n milliseconds (where n is set by the object creator) The ActionListener interface contains an actionPerformed method Whenever the timer expires (generating an ActionEvent) the animation can be updated 196 CLH GUI slides Rebound Program public class ReboundPanel extends JPanel { private final int WIDTH = 300, HEIGHT = 100; private final int DELAY = 20, IMAGE_SIZE = 35; private ImageIcon image; // be sure to declare timer at top of program private Timer timer; private int x, y, moveX, moveY; 197 CLH GUI slides //Sets up the panel, //including the timer for the animation. public ReboundPanel() { // create the timer and its listener class timer = new Timer(DELAY, new ReboundListener()); image = new ImageIcon ("happyFace.gif"); x = 0; y = 40; moveX = moveY = 3; // # of pixels to move each time setPreferredSize (new Dimension(WIDTH, HEIGHT)); setBackground (Color.black); timer.start(); // START TIMER } CLH GUI slides 198 // Class Represents the action listener for the timer. //*********************************** private class ReboundListener implements ActionListener { / Updates the position and direction of the image // whenever the timer fires an action event. //-------------------------------------------------------------public void actionPerformed (ActionEvent event) { x += moveX; y += moveY; if (x <= 0 || x >= WIDTH-IMAGE_SIZE) moveX = moveX * -1; if (y <= 0 || y >= HEIGHT-IMAGE_SIZE) moveY = moveY * -1; repaint(); // calls paintComponet() to redraw image } } } GUI slides 199 //----------------------------------------------------------------// is called from actionPerformed method // to Draws the image in the new location. // when the timer fires. // Each time the timer fires, it will redraw the image at a // new location //----------------------------------------------------------------public void paintComponent (Graphics page) { super.paintComponent (page); // draw the image on “this “ panel at location values of x and y image.paintIcon (this, page, x, y); } 200 CLH GUI slides Containment Hierarchies 201 CLH GUI slides Special Features Swing components offer special features to facilitate and enhance their use Special Feature Description Tool tip Causes a line of text to appear when the mouse cursor pauses over a component Mnemonic Allows an action to occur in response to a keyboard key combination Disable Allows a component to be explicitly enabled or disabled Border Surrounds a component with a border 202 CLH GUI slides Tool Tips Tool tips provide a short pop-up description when the mouse cursor rests momentarily on a component A tool tip is assigned using the setToolTipText method of a Swing component JButton button = new JButton ("Compute"); button.setToolTipText ("Calculate size."); 203 CLH GUI slides Mnemonics A mnemonic provides a keyboard alternative for pushing a button or selecting a menu option The mnemonic character should be chosen from the component's label, and is underlined The user activates the component by holding down the ALT key and pressing the mnemonic character A mnemonic is established using the setMnemonic method JButton button = new JButton ("Calculate"); button.setMnemonic ("C"); 204 CLH GUI slides Disabled Components Components can be disabled if they should not be used A disabled component is "grayed out" and will not respond to user interaction The status is set using the setEnabled method: JButton button = new JButton (“Do It”); button.setEnabled (false); 205 CLH GUI slides Special Features The right combination of special features and components can enhance the usefulness of a GUI See LightBulb.java(page 530) See LightBulbPanel.java(page 531) See LightBulbControls.java(page 533) 206 CLH GUI slides The LightBulb Program 207 CLH GUI slides File Choosers Situations often arise where we want the user to select a file stored on a disk drive, usually so that its contents can be read and processed A file chooser, represented by the JFileChooser class, simplifies this process A file chooser is a specialized dialog box created using the JFileChooser class The user can browse the disk and filter the file types displayed See DisplayFile.java (page 516) 208 CLH GUI slides The DisplayFile Program 209 CLH GUI slides Color Choosers In many situations we want to allow the user to select a color A color chooser , represented by the JColorChooser class, simplifies this process The user can choose a color from a palette or specify the color using RGB values A color can be selected using swatches or RGB values See DisplayColor.java (page 519) 210 CLH GUI slides The DisplayColor Program 211 CLH GUI slides In this application, radio buttons were displayed with various colors and the option for users to choose their own color with the colorChooser // a radio Button was selected to choose a color in main program public void actionPerformed(ActionEvent event) { // If the other radio button is pressed the JColorChooser pops up if(event.getActionCommand().equals("Other")) { // Allows user to pick another color , otherPanel is the panel it will be displayed on 212 CLH GUI slides // colorChosen is the color the user picks colorChosen = JColorChooser.showDialog(otherPanel, "Pick a Color!", colorChosen); // Sets a panel displayed next to radiobuttons to the current color being used colorPanel.setBackground(colorChosen); }// close if 213 CLH GUI slides else { // Sets current color to the radiobutton selected colorChosen = mycolor; // Sets panel next to radiobuttons to the current color being used colorPanel.setBackground(colorChosen); } }// Close actionPerformed 214 CLH GUI slides Scroll Panes A scroll pane is useful for images or information too large to fit in a reasonably-sized area A scroll pane offers a limited view of the component it contains It provides vertical and/or horizontal scroll bars that allow the user to scroll to other areas of the component No event listener is needed for a scroll pane See TransitMap.java (page 540) 215 CLH GUI slides The TransitMap Program 216 CLH GUI slides Split Panes A split pane (JSplitPane) is a container that displays two components separated by a moveable divider bar The two components can be displayed side by side, or one on top of the other Moveable Divider Bar Top Component Left Component Right Component Bottom Component 217 CLH GUI slides Split Panes The orientation of the split pane is set using the HORIZONTAL_SPLIT or VERTICAL_SPLIT constants The divider bar can be set so that it can be fully expanded with one click of the mouse The components can be continuously adjusted as the divider bar is moved, or wait until it stops moving Split panes can be nested 218 CLH GUI slides Lists The Swing Jlist class represents a list of items from which the user can choose The contents of a JList object can be specified using an array of objects A JList object generates a list selection event when the current selection changes See PickImage.java (page 544) See ListPanel.java (page 546) 219 CLH GUI slides The PickImage Program 220 CLH GUI slides Lists A JList object can be set so that multiple items can be selected at the same time The list selection mode can be one of three options: single selection – only one item can be selected at a time single interval selection – multiple, contiguous items can be selected at a time multiple interval selection – any combination of items can be selected The list selection mode is defined by a ListSelectionModel object We used the DefaultListModel because it contains a vector 221 CLH GUI slides Sliders A slider is a GUI component that allows the user to specify a value within a numeric range A slider can be oriented vertically or horizontally and can have optional tick marks and labels The minimum and maximum values for the slider are set using the JSlider constructor A slider produces a change event when the slider is moved, indicating that the slider and the value it represents has changed 222 CLH GUI slides Sliders The following example uses three sliders to change values representing the color components of an RGB value See SlideColor.java (page 522) See SlideColorPanel.java (page 523) 223 CLH GUI slides 224 CLH GUI slides public class SlideColorPanel extends JPanel { private JPanel controls, colorPanel; private JSlider rSlider, gSlider, bSlider; private JLabel rLabel, gLabel, bLabel; //----------------------------------------------------------------// Sets up the sliders and their labels, aligning them along // their left edge using a box layout. //----------------------------------------------------------------public SlideColorPanel() { rSlider = new JSlider (JSlider.HORIZONTAL, 0, 255, 0); rSlider.setMajorTickSpacing (50); // set values for ticks rSlider.setMinorTickSpacing (10); rSlider.setPaintTicks (true); // necessary to have ticks appear rSlider.setPaintLabels (true); // set labels for the ticks rSlider.setAlignmentX (Component.LEFT_ALIGNMENT); // sets up two other sliders CLH GUI slides 225 By default, spacing for major and minor tick marks is zero. To see tick marks, you must explicitly set the spacing for either major or minor tick marks (or both) to a non-zero value and call the setPaintTicks(true) method. However, you also need labels for your tick marks. To display standard, numeric labels at major tick mark locations, Set the major tick spacing(rSlider.setMajorTickSpacing (50);, then call the setPaintLabels(true) method. 226 CLH GUI slides SliderListener listener = new SliderListener(); // set change listeners for the sliders rSlider.addChangeListener (listener); gSlider.addChangeListener (listener); bSlider.addChangeListener (listener); create the labels and set alignment LEFT rLabel = new JLabel ("Red: 0"); rLabel.setAlignmentX (Component.LEFT_ALIGNMENT); gLabel = new JLabel ("Green: 0"); gLabel.setAlignmentX (Component.LEFT_ALIGNMENT); bLabel = new JLabel ("Blue: 0"); bLabel.setAlignmentX (Component.LEFT_ALIGNMENT); 227 CLH GUI slides Create a boxlayout for label/slider controls = new JPanel(); BoxLayout layout = new BoxLayout (controls, BoxLayout.Y_AXIS); controls.setLayout (layout); controls.add (rLabel); controls.add (rSlider); controls.add (Box.createRigidArea (new Dimension (0, 20))); controls.add (gLabel); controls.add (gSlider); controls.add (Box.createRigidArea (new Dimension (0, 20))); controls.add (bLabel); controls.add (bSlider); 228 CLH GUI slides // Create a Panel to display a color colorPanel = new JPanel(); colorPanel.setPreferredSize (new Dimension (100, 100)); colorPanel.setBackground (new Color (0, 0, 0)); add (controls); add (colorPanel); 229 CLH GUI slides //***************************************************************** // Represents the listener for all three sliders. //***************************************************************** private class SliderListener implements ChangeListener { private int red, green, blue; //-------------------------------------------------------------// Gets the value of each slider, then updates the labels and the color panel. //-------------------------------------------------------------public void stateChanged (ChangeEvent event) { red = rSlider.getValue(); // get all the slider values green = gSlider.getValue(); blue = bSlider.getValue(); rLabel.setText ("Red: " + red); gLabel.setText ("Green: " + green); bLabel.setText ("Blue: " + blue); // set the colorpanel to that color colorPanel.setBackground (new Color (red, green, blue)); } CLH GUI slides } 230 Polygons and Polylines Arrays can be helpful in graphics processing For example, they can be used to store a list of coordinates A polygon is a multisided, closed shape A polyline is similar to a polygon except that its endpoints do not meet, and it cannot be filled See Rocket.java (page 409) See RocketPanel.java (page 410) 231 CLH GUI slides The Polygon Class The Polygon class can also be used to define and draw a polygon It is part of the java.awt pacakage Versions of the overloaded drawPolygon and fillPolygon methods take a single Polygon object as a parameter instead of arrays of coordinates A Polygon object encapsulates the coordinates of the polygon 232 CLH GUI slides GUI Design We must remember that the goal of software is to help the user solve the problem To that end, the GUI designer should: Know the user Prevent user errors Optimize user abilities Be consistent Let's discuss each of these in more detail 233 CLH GUI slides Know the User Knowing the user implies an understanding of: the user's true needs the user's common activities the user's level of expertise in the problem domain and in computer processing We should also realize these issues may differ for different users Remember, to the user, the interface is the program 234 CLH GUI slides Prevent User Errors Whenever possible, we should design user interfaces that minimize possible user mistakes. Automate as much as possible by using components that limit the number of choices. We should choose the best GUI components for each task For example, in a situation where there are only a few valid options, using a menu or radio buttons would be better than an open text field Error messages should guide the user appropriately 235 CLH GUI slides Optimize User Abilities Not all users are alike – some may be more familiar with the system than others Knowledgeable users are sometimes called power users We should provide multiple ways to accomplish a task whenever reasonable "wizards" to walk a user through a process short cuts for power users Help facilities should be available but not intrusive 236 CLH GUI slides Be Consistent Consistency is important – users get used to things appearing and working in certain ways Colors should be used consistently to indicate similar types of information or processing Screen layout should be consistent from one part of a system to another – For example, error messages should appear in consistent locations e.g. A JtextArea. This way the user knows to look there if there is a problem 237 CLH GUI slides Designing for Inheritance As we've discussed, taking the time to create a good software design reaps long-term benefits Inheritance issues are an important part of an objectoriented design Properly designed inheritance relationships can contribute greatly to the elegance, maintainabilty, and reuse of the software Let's summarize some of the issues regarding inheritance that relate to a good software design 238 CLH GUI slides Inheritance Design Issues Every derivation should be an is-a relationship Think about the potential future of a class hierarchy, and design classes to be reusable and flexible Find common characteristics of classes and push them as high in the class hierarchy as appropriate Override methods as appropriate to tailor or change the functionality of a child Add new variables to children, but don't redefine (shadow) inherited variables 239 CLH GUI slides Inheritance Design Issues Allow each class to manage its own data; use the super reference to invoke the parent's constructor to set up its data Even if there are no current uses for them, override general methods such as toString and equals with appropriate definitions Use abstract classes to represent general concepts that lower classes have in common Use visibility modifiers carefully to provide needed access without violating encapsulation 240 CLH GUI slides Restricting Inheritance The final modifier can be used to curtail inheritance If the final modifier is applied to a method, then that method cannot be overridden in any descendent classes If the final modifier is applied to an entire class, then that class cannot be used to derive any children at all Thus, an abstract class cannot be declared as final These are key design decisions, establishing that a method or class should be used as is 241 CLH GUI slides The Component Class Hierarchy The Java classes that define GUI components are part of a class hierarchy Swing GUI components typically are derived from the JComponent class which is derived from the Container class which is derived from the Component class Many Swing components can serve as (limited) containers, because they are derived from the Container class For example, a JLabel object can contain an ImageIcon 242 CLH GUI slides The Component Class Hierarchy An applet is a good example of inheritance Recall that when we define an applet, we extend the Applet class or the JApplet class The Applet and JApplet classes already handle all the details about applet creation and execution, including: interaction with a Web browser accepting applet parameters through HTML enforcing security restrictions 243 CLH GUI slides The Component Class Hierarchy Our applet classes only have to deal with issues that specifically relate to what our particular applet will do When we define paintComponent method of an applet, we are actually overriding a method defined originally in the JComponent class and inherited by the JApplet class 244 CLH GUI slides Event Processing Polymorphism plays an important role in the development of a Java graphical user interface As we've seen, we establish a relationship between a component and a listener: JButton button = new JButton(); button.addActionListener(new MyListener()); Note that the addActionListener method is accepting a MyListener object as a parameter In fact, we can pass the addActionListener method any object that implements the ActionListener interface 245 CLH GUI slides Event Processing The source code for the addActionListener method accepts a parameter of type ActionListener (the interface) Because of polymorphism, any object that implements that interface is compatible with the parameter reference variable The component can call the actionPerformed method because of the relationship between the listener class and the interface Extending an adapter class to create a listener represents the same situation; the adapter class implements the appropriate interface already 246 CLH GUI slides Containment Hierarchies The way components are grouped into containers and the way those containers are nested within each other establishes the containment hierarchy for the GUI Each container can have its own layout manager The appearance of a GUI is determined by: the containment hierarchy the layout manager of each container the properties of individual components All of these issues work together to determine the final visual effect 247 CLH GUI slides The BorderDemo Program 248 CLH GUI slides Borders A border can be put around any Swing component to define how the edges of the component should be drawn Borders can be used effectively to group components visually The BorderFactory class contains several static methods for creating border objects A border is applied to a component using the setBorder method 249 CLH GUI slides Borders An empty border buffers the space around the edge of a component otherwise has no visual effect A line border surrounds the component with a simple line the line's color and thickness can be specified An etched border creates the effect of an etched groove around a component uses colors for the highlight and shadow 250 CLH GUI slides Borders A bevel border can be raised or lowered uses colors for the outer and inner highlights and shadows A titled border places a title on or around the border the title can be oriented in many ways A matte border specifies the sizes of the top, left, bottom, and right edges of the border separately uses either a solid color or an image 251 CLH GUI slides Borders A compound border is a combination of two borders one or both of the borders can be a compound border See BorderDemo.java (page 355) 252 CLH GUI slides public static void main (String[] args) { JPanel panel = new JPanel(); panel.setLayout (new GridLayout (0, 2, 5, 10)); panel.setBorder (BorderFactory.createEmptyBorder (5, 5, 5, 5)); JPanel p1 = new JPanel(); p1.setBorder (BorderFactory.createLineBorder (Color.red, 3)); p1.add (new JLabel ("Line Border")); panel.add (p1); 253 CLH GUI slides JPanel p2 = new JPanel(); p2.setBorder (BorderFactory.createEtchedBorder ()); p2.add (new JLabel ("Etched Border")); panel.add (p2); JPanel p3 = new JPanel(); p3.setBorder (BorderFactory.createRaisedBevelBorder ()); p3.add (new JLabel ("Raised Bevel Border")); panel.add (p3); 254 CLH GUI slides JPanel p4 = new JPanel(); p4.setBorder (BorderFactory.createLoweredBevelBorder ()); p4.add (new JLabel ("Lowered Bevel Border")); panel.add (p4); JPanel p5 = new JPanel(); p5.setBorder (BorderFactory.createTitledBorder ("Title")); p5.add (new JLabel ("Titled Border")); panel.add (p5); 255 CLH GUI slides JPanel p6 = new JPanel(); TitledBorder tb = BorderFactory.createTitledBorder ("Title"); tb.setTitleJustification (TitledBorder.RIGHT); p6.setBorder (tb); p6.add (new JLabel ("Titled Border (right)")); panel.add (p6); JPanel p7 = new JPanel(); Border b1 = BorderFactory.createLineBorder (Color.blue, 2); Border b2 = BorderFactory.createEtchedBorder (); p7.setBorder (BorderFactory.createCompoundBorder (b1, b2)); p7.add (new JLabel ("Compound Border")); panel.add (p7); 256 CLH GUI slides JPanel p8 = new JPanel(); Border mb = BorderFactory.createMatteBorder (1, 5, 1, 1, Color.yellow); p8.setBorder (mb); p8.add (new JLabel ("Matte Border")); panel.add (p8); } } 257 CLH GUI slides Tiled Pictures Consider the task of repeatedly displaying a set of images in a mosaic Three quadrants contain individual images Upper-left quadrant repeats pattern The base case is reached when the area for the images shrinks to a certain size See TiledPictures.java (page 594) 258 CLH GUI slides Tiled Pictures 259 CLH GUI slides Fractals A fractal is a geometric shape made up of the same pattern repeated in different sizes and orientations The Koch Snowflake is a particular fractal that begins with an equilateral triangle To get a higher order of the fractal, the sides of the triangle are replaced with angled line segments See KochSnowflake.java (page 597) See KochPanel.java (page 600) 260 CLH GUI slides Koch Snowflakes < x5 , y5 > < x 5 , y5 > < x 4 , y4 > Becomes < x3 , y 3 > < x 2 , y2 > < x1 , y1 > < x 1 , y1 > 261 CLH GUI slides Koch Snowflakes 262 CLH GUI slides Koch Snowflakes 263 CLH GUI slides The Component Class Hierarchy The Java classes that define GUI components are part of a class hierarchy Swing GUI components typically are derived from the JComponent class which is derived from the Container class which is derived from the Component class Many Swing components can serve as (limited) containers, because they are derived from the Container class 264 CLH GUI slides Graphics Class Hierarchy (Swing) AWTEvent Font Classes in the java.awt package LayoutManager 1 Heavyweight FontMetrics Object Color Panel Applet JApplet Window Frame JFrame Dialog JDialog Graphics Component Container * Swing Components in the javax.swing package JComponent Lightweight 265 CLH GUI slides JComponent . JCheckBoxMenuItem AbstractButton JMenuItem JMenu JButton .JRadioButtonMenuItem .JToggleButton JCheckBox JRadioButton .JEditorPane JComponent .JTextComponent .JTextField .JPasswordField .JTextArea .JLabel .JList .JComboBox .JMenuBar .JPanel .JOptionPane .JScrollBar .JScrollPane .JPopupMenu .JSeparator .JSlider .JTabbedPane .JRootPane .JPane .JProgressBar .JToolBar .JSplitPane .JTable .JTree .JColorChooser .JInternalFrame .JToolTip .JLayeredPane .JTableHeader .JFileChooser 266 CLH GUI slides 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 267 CLH GUI slides