| Buttons provide the most common event generating components in 
              user interfaces. Clicking on the button should initiate some action. 
              In fact, the term action is used in the names for the button 
              even handling machinery: 
              A button maintains a list of objects that implement the ActionListener 
                interface. 
 
When the button is pressed, it invokes the actionPerformed 
                method for all of the ActionListener 
                instances in its list. 
 
ActionListener 
                classes override the abstract actionPerformed 
                method to perform the task for the button.
 
An ActionEvent 
                object is passed as an argument of actionPerformed 
                and from it you can extract information about the event such as 
                which ActionListener 
                initated the event.
 
To add an ActionListener 
                instance to a button, invoke its addActionListener(ActionListener) 
                method. The following applet illustrates the above button event handling 
              process. PictureButton_Applet2 
              implements the ActionListener 
              interface and so provides a actionPerformed 
              method. An instance of a subclass of JButton 
              is created and the applet is added to its actionListener list with 
              the       
              button.addActionListener(this); 
               statement. Each time the button is pushed, the actionPerformed 
              method is called and the Applet's showStatus 
              method is invoked. This method displays a string on the status line 
              of the browser (along the botton border for most browsers.)   
              
                 
                  |  |   
                  | import 
                    javax.swing.*; import java.awt.*;
 import java.awt.event.*;
 
 /** Demonstrate event handling with two buttons. **/
 public class PlainButtonApplet extends JApplet
 implements ActionListener
 
 {
 int fPushACount = 0;
 int fPushBCount = 0;
 
 /** Build the interface with two buttons. **/
 public void init () {
 Container content_pane = getContentPane 
                    ();
 content_pane.setLayout (new FlowLayout 
                    ());
 
 // Create an instance of JButton
 JButton button_a = new JButton ("A");
 
 // Create an instance of JButton
 JButton button_b = new JButton ("B");
 
 // Add this applet to each button's 
                    ActionListener list
 button_a.addActionListener (this);
 button_b.addActionListener (this);
 
 JPanel panel = new JPanel ();
 
 // Add the buttons to the content 
                    pane.
 content_pane.add (button_a);
 content_pane.add (button_b);
 
 } // client()
 
 /** Count each button click and post total on 
                    status line. **/
 public void actionPerformed (ActionEvent event) 
                    {
 
 String cmd = event.getActionCommand 
                    ();
 
 if ( cmd.equals ("A")){
 fPushACount++;
 showStatus 
                    (event.getActionCommand () +
 " 
                    pushed " + fPushACount + " times");
 }else{
 fPushBCount++;
 showStatus (event.getActionCommand 
                    () +
 " 
                    pushed " + fPushBCount + " times");
 }
 
 } // actionPerformed()
 
 } // class PlainButtonApplet
 |  Event Objects The event classes provides information on the event 
              that allow the listener to find out, for example, what component 
              generated the event. A button generates an ActionEvent, 
              which as the following subclass structure: 
              java.lang.Object|
 +--java.util.EventObject
 |
 +--java.awt.AWTEvent
 |
 +--java.awt.event.ActionEvent
 See the API 
              Specifications for a list of the methods available from 
              these classes but the most commonly used include 
              getSource() 
                in EventObject 
                - returns an instance of Object 
                for the component that generated the event.getActionCommand() 
                in ActionEvent 
                - returns the text for the JButton 
                that generated the action. Note that the ActionListener 
              can register with more than one button. These methods provide the 
              identity of the button that generated a particular event. Below we modify the applet MultiPanelApplet.java 
              discussed in the previous chapter. 
              That applet displayed buttons, text fields, and a text area but 
              had no functionality. In the applet MultiPanelWithEvents 
              shown below, the buttons cause the two values in the text fields 
              to be added or multiplied together and the result displayed in the 
               JTextArea 
              component. The applet implements the ActionListener 
              interface. We modify the ActionButtonsPanel 
              class so that it takes an ActionListener 
              reference in the constructor and adds the listener to the buttons. 
              The InputsPanel 
              class needs no modification. The actionPerformed() 
              method in the applet grabs the two values from the text fields and 
              carries out the desired operation by examining the action command 
              string.   
              
                 
                  |  |   
                  |  import 
                      java.awt.*;import java.awt.event.*;
 import javax.swing.*;
 
 /** Demonstrate GUI building with multiple panels and event 
                      handling. **/
 public class MultiPanelWithEvents extends JApplet
 implements 
                      ActionListener {
 
 InputsPanel fInputsPanel;
 JTextArea fTextOutput;
 
 /** Build the interface with InputsPanel and 
                      ActionButtonsPanel. **/
 public void init () {
 Container content_pane = getContentPane 
                      ();
 
 // Set the layout as before with 
                      1 row of 3 columns
 // but now in one step.
 content_pane.setLayout (new GridLayout 
                      (1, 3));
 
 // First create a panel of buttons
 ActionButtonsPanel buttons_panel 
                      =
 new ActionButtonsPanel 
                      (this);
 
 // Next create a panel of input 
                      fields and labels
 fInputsPanel =
 new InputsPanel 
                      ("Input x ", "1.5",
 "Input y ", "3.14");
 
 // Use a JTextArea for the output 
                      of the calculations.
 fTextOutput = new JTextArea ();
 fTextOutput.setBackground (Color.LIGHT_GRAY);
 fTextOutput.setEditable (false);
 
 // The grid fills the 3 columns 
                      sequentially.
 content_pane.add (buttons_panel);
 content_pane.add (fInputsPanel);
 content_pane.add (fTextOutput);
 
 } // init
 
 /** Handle the button events.**/
 public void actionPerformed (ActionEvent ae) 
                      {
 
 String str1 = fInputsPanel.fTextfieldTop.getText 
                      ();
 String str2 = fInputsPanel.fTextfieldBot.getText 
                      ();
 
 double val1=0.0;
 double val2=0.0;
 
 try {
 val1 = Double.parseDouble 
                      (str1);
 val2 = Double.parseDouble 
                      (str2);
 } catch  (NumberFormatException 
                      nfe){
 System.out.println ("Improper 
                      input");
 }
 
 if (ae.getActionCommand ().equals 
                      ("Add") ){
 fTextOutput.setText 
                      ("x + y = " +  (val1+val2));
 } else {
 fTextOutput.setText 
                      ("x * y = " +  (val1*val2));
 }
 } // actionPerformed
 
 } // class MultiPanelWithEvents
 
   
                   |   
                  | import 
                    java.awt.event.*; import javax.swing.*;
 
 /** JPanel subclass with two buttons. **/
 public class ActionButtonsPanel extends JPanel {
 
 /** Constructor adds 2 buttons to the panel and
 * adds the listener passed as an argument.
 **/
 ActionButtonsPanel (ActionListener listener) {
 
 // Create two buttons
 JButton add_but =  new JButton 
                    ("Add" );
 JButton mult_but = new JButton ("Mult");
 
 add_but.addActionListener (listener);
 mult_but.addActionListener (listener);
 
 // Put a button in each grid cell
 add (add_but);
 add (mult_but);
 } // ctor
 
 } // class ActionButtonsPanel
 |   
                  | import 
                      java.awt.*;import javax.swing.*;
 
 /** Panel to hold input textfields. **/
 public class InputsPanel extends JPanel {
 
 JTextField fTextfieldTop=null;
 JTextField fTextfieldBot=null;
 
 /** Constructor builds panel with labels and 
                      text fields. **/
 InputsPanel (String label_str_top, String init_top,
 String label_str_bot, String init_bot) {
 
 // Set the layout with 2 rows by 
                      2 columns
 setLayout (new GridLayout (2,2));
 
 // Create two text fields with the 
                      initial values
 fTextfieldTop = new JTextField (init_top);
 fTextfieldBot = new JTextField (init_bot);
 
 // Create the first label and right 
                      justify the text
 JLabel label_top =
 new 
                      JLabel (label_str_top, SwingConstants.RIGHT);
 
 // Insert the label and textfield 
                      into the top grid row
 add (label_top);
 add (fTextfieldTop);
 
 // Create the second label and right 
                      justify the text
 JLabel label_bot =
 new JLabel (label_str_bot, 
                      SwingConstants.RIGHT);
 
 // Insert the second label and textfield 
                      into the bottom grid row
 add (label_bot);
 add (fTextfieldBot);
 } // ctor
 
 } // class InputsPanel
 |    Latest update: March 8, 2006 |