| While JOptionPane 
              offers a powerful way to generate basic dialogs, to create more 
              elaborate interactions with the user you will usually find it necessary 
              to subclass JDialog 
              (Java 
              5.0 Specs). With it you can add multiple components, you can 
              return more than a single value, and you can do checks on the user 
              inputs and inform the user if those inputs need modification. In the example below, the applet can open a frame, 
              which in turn uses an instance of a JDialog 
              subclass to obtain a URL address from the user. The GetUrlDialog 
              checks the input for proper form before returning to the caller. Note that here we use an interface to provide the 
              callback mechanism. The frame class implements our TextSetable 
              interface that holds a single method for passing a string. The method 
              includes an integer arguement as well, to identify the particular 
              text.  
              
                 
                  | MakeJDialogApplet MakeJDialogJFrame
 GetUrlDialog
 TextSetable
 
 |   
                  |  import 
                      javax.swing.*;import java.awt.*;
 import java.awt.event.*;
 
 /**
 * This program illustrates the creation of a 
                      JDialog subclass.
 * It follows the example of a request to the 
                      user to input a URL
 * address.
 *
 * The applet uses a JFrame subclass with a menubar 
                      and buttons
 * that can create an instance of GetUrlDialog, 
                      which is a subclass
 * of JDialog. It will pass the URL text back 
                      to the frame using
 * a method from the TextSetable interface.
 **/
 public class MakeJDialogApplet extends JApplet
 implements ActionListener
 {
 public void init () {
 Container content_pane = getContentPane 
                      ();
 
 JPanel panel = new JPanel (new BorderLayout 
                      ());
 
 JButton button_open = new JButton 
                      ("Open");
 button_open.addActionListener (this);
 panel.add (button_open, "Center");
 content_pane.add (panel);
 
 } // init
 
 //  Open the frame
 public void actionPerformed (ActionEvent e ) 
                      {
 String command = e.getActionCommand 
                      ();
 if (command.equals ("Open")) {
 // Create 
                      an instance of the frame and show it.
 MakeJDialogFrame 
                      f =  new MakeJDialogFrame (this);
 f.setVisible 
                      (true);
 }
 } // actionPerformed
 
 } // class MakeJDialogApplet
 |   
                  | import javax.swing.*;
 import java.awt.*;
 import java.awt.event.*;
 
 /** This frame uses the TextSetable interface for a call
 * back from the dialog to provide URL text.
 **/
 public class MakeJDialogFrame extends JFrame
 implements ActionListener, TextSetable
 {
 // Keep a reference to the applet parent.
 MakeJDialogApplet fApplet;
 JLabel fLabel;
 
 int URL_TEXT = 1;
 
 /** Create the frame with a couple of buttons 
                      and
 * a menubar with one dropdown menu.
 **/
 MakeJDialogFrame (MakeJDialogApplet applet) 
                      {
 super ("Frame Test");
 fApplet = applet;
 
 Container content_pane = getContentPane 
                      ();
 
 // Create a simple interface.
 content_pane.setLayout ( new GridLayout 
                      (2,1) );
 
 content_pane.add (fLabel =
 new JLabel ("http://www.default.com",JLabel.CENTER));
 
 JPanel panel = new JPanel ();
 
 JButton button1 = new JButton ("Get 
                      URL");
 button1.addActionListener (this);
 
 JButton button_quit = new JButton 
                      ("Quit");
 button_quit.addActionListener (this);
 
 panel.add (button1);
 panel.add (button_quit);
 content_pane.add (panel);
 
 // Use the helper method makeMenuItem
 // for making the menu items and 
                      registering
 // their listener.
 JMenu m = new JMenu ("Tasks");
 
 // Menu items for the drop down 
                      menu.
 m.add (makeMenuItem ("Get URL"));
 m.add (makeMenuItem ("Quit"));
 
 JMenuBar mb = new JMenuBar ();
 mb.add (m);
 
 setJMenuBar (mb);
 pack ();
 
 } // ctor
 
 // Override the TextSetable method with this 
                      concrete version
 // which gets the URL from the dialog.
 public void setText (int textID, String text) 
                      {
 if (textID == URL_TEXT) {
 fLabel.setText (text);
 }
 } // setText
 
 //
 public void actionPerformed (ActionEvent e) 
                      {
 String command = e.getActionCommand 
                      ();
 if (command.equals ("Get URL")) 
                      {
 // Open 
                      a dialog to get the text for a URL
 GetUrlDialog 
                      getUrl =
 new GetUrlDialog 
                      (this, this, URL_TEXT,
 fLabel.getText (),
 true, "Input URL");
 } else if (command.equals ("Quit")) 
                      {
 dispose 
                      ();
 }
 } // actionPerformed
 
 // This "helper method" makes a menu item and 
                      then
 // registers this applet as a listener to it.
 private JMenuItem makeMenuItem (String name) 
                      {
 JMenuItem m = new JMenuItem ( name 
                      );
 m.addActionListener ( this );
 return m;
 }
 
 } // class MakeJDialogFrame
 |   
                  | /** This 
                      interface provides for a callback to pass text. **/interface TextSetable
 {
 /** The textID allows the receiving class to
 * identify what the text represents 
                      using its
 * own ID numbering scheme.
 **/
 void setText(int textID, String text);
 
 } // interface TextSetable
 |   
                  | import 
                      java.util.*;import java.awt.*;
 import java.awt.event.*;
 import javax.swing.*;
 
 /**
 * This program illustrates how to create a dialog 
                      by
 * subclassing JDialog. Here we use the example 
                      of obtaining
 * a URL from the user. Provides a dialog to 
                      enter URL
 * for the downloading a story over the web.
 **/
 public class GetUrlDialog extends JDialog implements 
                      ActionListener
 {
 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++GetUrlDialog+++++++++
 JFrame fParent;
 
 JTextField fUrlField;
 String fUrlData;
 
 Container fContainer;
 GridBagLayout fGridBag;
 GridBagConstraints fGBC = new GridBagConstraints 
                      ();
 
 JButton fButtonOK;
 JButton fButtonHelp;
 
 TextSetable fUrlRequestor; // Use TextSetable 
                      interface for callback
 int fTextID = 0; // Type of text
 
 //-------------------------------------------------------GetUrlDialog---------
 public GetUrlDialog (JFrame frame,
 TextSetable 
                      urlRequestor, int textID,
 String 
                      urlData,
 boolean 
                      modal, String title) {
 // Call the JDialog constructor.
 super (frame, title, modal);
 fUrlData = urlData;
 fParent = frame;
 
 // Get requestor for call back
 fUrlRequestor = urlRequestor;
 fTextID = textID;
 
 fContainer = this.getContentPane 
                      ();
 
 // Set the background color of DateDialog.
 fContainer.setBackground (Color.white);
 
 //  Create a confirmation 
                      button.
 fButtonOK = new JButton ("OK");
 fButtonOK.setMnemonic ('O');
 fButtonOK.setPreferredSize (new 
                      Dimension (70, 25));
 fButtonOK.addActionListener (this);
 
 //  Create a cancel button.
 JButton button_cancel = new JButton 
                      ("Cancel");
 button_cancel.setMnemonic ('C');
 button_cancel.setPreferredSize (new 
                      Dimension (75, 25));
 button_cancel.addActionListener 
                      (this);
 
 //  Create a help button.
 fButtonHelp = new JButton ("Help");
 fButtonHelp.setMnemonic ('H');
 fButtonHelp.setPreferredSize (new 
                      Dimension (70, 25));
 fButtonHelp.addActionListener (this);
 
 //  Create a panel to 
                      hold the buttons
 JPanel button_panel = new JPanel 
                      ();
 button_panel.setBackground (Color.white);
 button_panel.add (fButtonOK);
 button_panel.add (button_cancel);
 button_panel.add (fButtonHelp);
 
 //  Use a gridbag layout 
                      for the contentpane
 fGridBag = new GridBagLayout ();
 fContainer.setLayout (fGridBag);
 
 //
 fGBC.fill = GridBagConstraints.BOTH;
 fGBC.gridwidth=6; fGBC.gridheight=1;
 fGBC.weightx=1; fGBC.weighty=1;
 fGBC.insets = new Insets (10,20,10,20);
 
 addGB (button_panel, 0,1);
 
 // Give the labels a small weightx 
                      and a
 // width of 1 to push them to the 
                      left
 fGBC.weightx=0.10; fGBC.weighty=1.0;
 fGBC.gridwidth=1; fGBC.gridheight=1;
 fGBC.insets = new Insets (0,0,0,10);
 JLabel label = new JLabel ("URL",SwingConstants.RIGHT);
 addGB (label,0,0);
 
 // Give the textfields a large weightx 
                      and a
 // width of 5 so they will have 
                      a long x width
 fGBC.weightx=1.0; fGBC.weighty=1.0;
 fGBC.insets = new Insets (10,0,10,10);
 fGBC.gridwidth=5; fGBC.gridheight=1;
 fUrlField  = new JTextField 
                      ();
 addGB (fUrlField,1,0);
 
 fUrlField.setText (fUrlData);
 
 // Resize the dialog box and position 
                      it at the center of
 // the applet.
 setSize (300,125);
 Dimension dialogDim = getSize ();
 Dimension frameDim = frame.getSize 
                      ();
 Dimension screenSize = getToolkit 
                      ().getScreenSize ();
 Point location = frame.getLocation 
                      ();
 location.translate (
 (frameDim.width-dialogDim.width)/2,
 (frameDim.height-dialogDim.height)/2);
 location.x = Math.max ( 0, Math.min 
                      (location.x,
 screenSize.width-getSize ().width));
 location.y = Math.max (0, Math.min 
                      (location.y,
 screenSize.height-getSize ().height));
 
 setLocation (location.x, location.y);
 
 setVisible (true);
 } // ctor
 
 //-------------------------------------------------------addGB----------------
 public void addGB (Component component, int 
                      x, int y) {
 fGBC.gridx=x; fGBC.gridy = y;
 fGridBag.setConstraints (component, 
                      fGBC);
 fContainer.add (component);
 } // addGB
 
 //-------------------------------------------------------actionPerformed------
 /** When the OK button on the dialog box is 
                      clicked. **/
 public void actionPerformed (ActionEvent e) 
                      {
 if (e.getSource () == fButtonOK)  {
 fUrlData 
                      = fUrlField.getText ().trim ();
 
 // Check 
                      the entry for proper length and form.
 if (fUrlData.length 
                      () == 0) {
 JOptionPane.showMessageDialog 
                      (null,
 "Empty URL entry!", "Input Error",
 JOptionPane.ERROR_MESSAGE);
 return;
 }
 
 // Use the 
                      URL class to determine if the URL
 // entry 
                      is in proper form.
 try {
 java.net.URL 
                      url = new java.net.URL (fUrlData);
 }
 catch (java.net.MalformedURLException 
                      ex) {
 JOptionPane.showMessageDialog (null,
 "Malformed URL entry!", "Input Error",
 JOptionPane.ERROR_MESSAGE);
 return;
 }
 
 // Pass 
                      the URL back to the caller. Use the fTextID
 // number 
                      to let caller know what type of text is being
 // passed.
 fUrlRequestor.setText 
                      (fTextID, fUrlData);
 
 } else if (e.getSource () == fButtonHelp) 
                      {
 JOptionPane.showMessageDialog 
                      (null,
 "Help message...");
 return; 
                      // Don't close dialog
 }
 // Close dialog after OK or Cancel 
                      button clicked
 this.dispose ();
 } // actionPerformed
 
 } // GetUrlDialog
 |    References & Web Resources Latest update: Nov. 4, 2004 |