| In this section we add interactive graphics components to our histogram 
              display so that the user can interact with the program.  We use the Histogram, 
               HistFormat, 
              and HistPanel 
              classes discussed in the Chapter 
              6: Tech : Histogram Display program. Here the applet program 
              adds the histogramming panel HistPanel 
              to its content pane and also a panel with 3 buttons and a textfield. 
              The textfield holds the number of values to be added to the histogram 
              when the "Go" button is pushed. The "Clear" 
              button empties the histogram.  
              
                 
                  |  
                      UIDrawHistApplet.java 
                         
                        - 
                        The applet uses HistPanel object to display the contents 
                        of an instance of Histogram. PlotFormat used by HistPanel 
                        to format the scale values. The 
                        applet holds the output JPanel subclass for graphics   output. 
                        Includes "Go","Clear", and "Exit" buttons to initiate 
                        processing, clear the text area, and exit when in standalone 
                        mode.   
                        + Previous classes:Chapter 
                        6:Tech: Histogram.java, 
                        HistPanel.java
 Chapter 
                        6:Tech: PlotPanel.java, 
                        PlotFormat.java
 
 |   
                  | Java Techniques 
                      & Other Programming Notes 
                      The conversion of the string obtained from the textfield 
                        to an integer can throw an exception. Here we indicate 
                        the bad value by showing an error message on the browser 
                        status bar. A more sophisticated approach would involve 
                        opening a dialog warning window but we will discuss dialogs 
                        later. 
 
Programmers will typically add the ActionListener 
                        object, here the applet, to the actionlistenters list 
                        in the text field . Then when one enters text and hits 
                        Enter on the keyboard, the text field will send 
                        an action event actionPerformed() 
                        method in the ActionListener 
                        object., which can then grab the string from the text 
                        field and update the particular parameter of interest. 
                        
 However, if the user forgets to hit Enter, no action 
                        will occur and the old value will remain in the parameter.
 
 The example here shows a more user friendly approach. 
                        The value in the text field is taken whenever the Go 
                        button is pushed. This insures that the value showing 
                        in the textfile is always the parameter used in the calculation.
   |   
                  |  import 
                      javax.swing.*;import java.awt.*;
 import java.awt.event.*;
 
 /**
 *  This program will run as an applet 
                      inside
 *  an application frame.
 *
 * The applet uses the HistPanel to display contents 
                      of
 *  an instance of Histogram. HistFormat 
                      used by HistPanel to
 *  format the scale values.
 *
 *  Includes "Go" button to add random 
                      values from a Gaussian
 *  distribution to the histogram. 
                      The number of values taken from
 *  entry in a JTextField. "Clear"  button 
                      clears the histogram.
 *  In standalone mode, the Exit button 
                      closes the program.
 *
 **/
 public class UIDrawHistApplet extends JApplet
 implements ActionListener
 {
 // Use the HistPanel JPanel subclass here
 HistPanel fOutputPanel = null;
 
 Histogram fHistogram;
 int fNumDataPoints   = 100;
 
 // A text field for input strings
 JTextField fTextField = null;
 
 // Flag for whether the applet is in a browser
 // or running via the main () below.
 boolean fInBrowser = true;
 
 //Buttons
 JButton fGoButton;
 JButton fClearButton;
 JButton fExitButton;
 
 /**
 * Create a User Interface with a 
                      textarea with sroll bars
 * and a Go button to initiate processing 
                      and a Clear button
 * to clear the textarea.
 **/
 public void init () {
 
 Container content_pane = getContentPane 
                      ();
 
 JPanel panel = new JPanel (new BorderLayout 
                      ());
 
 // Create a histogram with Gaussian 
                      distribution.
 makeHist ();
 
 // JPanel subclass here.
 fOutputPanel = new HistPanel (fHistogram);
 
 panel.add (fOutputPanel,"Center");
 
 // Use a textfield for an input 
                      parameter.
 fTextField =
 new JTextField (Integer.toString 
                      (fNumDataPoints), 10);
 
 // If return hit after entering 
                      text, the
 // actionPerformed will be invoked.
 fTextField.addActionListener (this);
 
 fGoButton = new JButton ("Go");
 fGoButton.addActionListener (this);
 
 fClearButton = new JButton ("Clear");
 fClearButton.addActionListener (this);
 
 fExitButton = new JButton ("Exit");
 fExitButton.addActionListener (this);
 
 JPanel control_panel = new JPanel 
                      ();
 
 control_panel.add (fTextField);
 control_panel.add (fGoButton);
 control_panel.add (fClearButton);
 control_panel.add (fExitButton);
 
 if (fInBrowser) fExitButton.setEnabled 
                      (false);
 
 panel.add (control_panel,"South");
 
 // Add text area with scrolling 
                      to the contentPane.
 content_pane.add (panel);
 
 } // init
 
 /** Respond to buttons. **/
 public void actionPerformed (ActionEvent e){
 Object source = e.getSource ();
 if (source == fGoButton || source 
                      == fTextField) {
 String strNumDataPoints 
                      = fTextField.getText ();
 
 try {
 fNumDataPoints 
                      = Integer.parseInt (strNumDataPoints);
 } catch 
                      (NumberFormatException ex) {
 // 
                      Could open an error dialog here but just
 // 
                      display a message on the browser status line.
 showStatus 
                      ("Bad input value");
 return;
 }
 makeHist 
                      ();
 repaint 
                      ();
 
 } else if (source == fClearButton  ) 
                      {
 fHistogram.clear 
                      ();
 repaint 
                      ();
 
 } else if (!fInBrowser)
 System.exit 
                      (0);
 
 }// actionPerformed()
 
 /** Create a histogram if it doesn't yet exit. 
                      Fill it
 * with Gaussian random distribution.
 **/
 void makeHist () {
 // Create an instance of the Random 
                      class for
 // producing our random values.
 java.util.Random r = new java.util.Random 
                      ();
 
 // Them method nextGaussian in the 
                      class Random produces
 // a value centered at 0.0 and a 
                      standard deviation of 1.0.
 
 // Create an instance of our histogram 
                      class. Set the range
 // sot that it includes most of 
                      the distribution.
 if (fHistogram == null)
 fHistogram 
                      = new Histogram ("Gaussian Distribution",
 "random 
                      values",
 20,-3.0,3.0);
 
 // Fill histogram with Gaussian 
                      distribution
 for (int i=0; i < fNumDataPoints; 
                      i++) {
 double val 
                      = r.nextGaussian ();
 fHistogram.add 
                      (val);
 }
 } // makeHist
 
 /** Create a frame and add the applet to it. 
                      **/
 public static void main (String[] args) {
 // Dimensions for our frame
 int frame_width  = 450;
 int frame_height = 300;
 
 // Create an instance of the applet 
                      to add to the frame.
 UIDrawHistApplet applet = new UIDrawHistApplet 
                      ();
 applet.fInBrowser = false;
 applet.init ();
 
 // Create the frame with the title
 JFrame f = new JFrame ("Histogram 
                      with Gaussian");
 f.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
 
 // Add applet to the frame and display 
                      the frame.
 f.getContentPane ().add ( applet);
 f.setSize (new Dimension (frame_width,frame_height));
 f.setVisible (true);
 
 } // main
 
 } // class UIDrawHistApplet
 |    References & Web Resources Last update: Nov. 4, 2004 |