Home : Course Map : Chapter 12 : Java :
Popup Menus
JavaTech
Course Map
Chapter 12

Printing
  Demo 1
Cursor Icons
  Demo 2
MouseButtons
  Demo 3
PopupMenu
  Demo 4
Keystrokes
  Demo 5
Audio
  Demo 6
Timing & Speed
  Demo 7
Toolkit
  Demo 8
AppletContext
  Demo 9
Exercises

    Supplements
Java Beans
More APIs
Java & Browsers
  Demo 1
     About JavaTech
     Codes List
     Exercises
     Feedback
     References
     Resources
     Tips
     Topic Index
     Course Guide
     What's New

On each GUI platform a particular mouse button or combination of mouse button and key strokes (such ast CTRL or ALT keys) brings up a popup menu.

A popup menu is a dialog window, usually displayed close to the cursor where you clicked, that contains some items to initiate operations related to what you clicked on (such as cut, copy, paste in an editor.)

To provide for platform portability, the AWT provides the isPopupTrigger() method in the MouseEvent class. It will indicate if the button/key combo for a popup menu on the current OS has been activiated. For example, on Windows machines this is the right mouse button.

The PopupApplet program below illustrates the creation of a popup menu to choose the background color for the component on which the menu was requested. The program also illustrates the use of an annonymous inner class, in this case a MouseAdapter, for this kind of task.

PopupApplet

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

/** Demonstration of popup menus. **/
public class PopupApplet extends JApplet
{
  /** Create a simple interface with two panels.**/
  public void init ()  {
    Container content_pane = getContentPane ();
    PopupPanel popup_panel = new PopupPanel ();

    // Add the panel that will display the popup menu
    content_pane.add (popup_panel);
  } // init

} // class PopupApplet

/** Popup menu offers choices for colors of 2 subpanels.**/
class PopupPanel extends JPanel
                 implements ActionListener
{
  MouseAdapter fAdapter;
  JPopupMenu fColorMenu;
  Component fSelectedComponent;
  Component fParent;

  /** Constructor creates an interface with two panels. A PopupMenu
    * will offer a choice of colors for the panels.
   **/
  PopupPanel () {
    setLayout (new GridLayout (2,1));

    JPanel canvas1 = new JPanel ();
    canvas1.setBackground (Color.RED);
    add (canvas1);

    JPanel canvas2 = new JPanel ();
    canvas2.setBackground (Color.GREEN);
    add (canvas2);

    // Create the popup menu
    makePopup ();

    // Add the MouseAdapter that opens the popup.
    canvas1.addMouseListener (fAdapter);
    canvas2.addMouseListener (fAdapter );
  } // ctor

  /** Create the popup menu and a MouseAdapter that opens it
    * when right button (or equivalent) is clicked.
   **/
  void makePopup () {
    fColorMenu = new JPopupMenu ("Color");
    fColorMenu.add (makeMenuItem ("Red") );
    fColorMenu.add (makeMenuItem ("Green") );
    fColorMenu.add (makeMenuItem ("Blue") );

    // Create a MouseAdapter that creates a Popup menu
    // when the right mouse or equivalent button clicked.
    fAdapter = new MouseAdapter () {

      // On some platforms, mouseReleased sets PopupTrigger.
      public void mouseReleased (MouseEvent e) {
        if (e.isPopupTrigger ()) {
            showPopupMenu (e);
        }
      }

      // And on other platforms, mousePressed sets PopupTrigger.
      public void mousePressed (MouseEvent e) {
        if (e.isPopupTrigger ()) {
           showPopupMenu (e);
        }
      }

      // Get the component over which the right button click
      // occurred and show the menu there.
      public void showPopupMenu (MouseEvent e) {
        fSelectedComponent = e.getComponent ();
        fColorMenu.show (fSelectedComponent, e.getX (), e.getY ());
      }

    }; // anonymous MouseAdapter subclass

  } // makePopup

  /** Change background color of selected components.**/
  public void actionPerformed (ActionEvent e) {
    String color = e.getActionCommand ();

    if (color.equals ("Red") )
      fSelectedComponent.setBackground (Color.red);
    else if(color.equals ("Green") )
      fSelectedComponent.setBackground (Color.green);
    else if (color.equals ("Blue"))
      fSelectedComponent.setBackground (Color.blue);
    else
      setBackground (Color.white);
  } // actionPerformed

  /** A utility method for making menu items. **/
  private JMenuItem makeMenuItem (String label) {
    JMenuItem item = new JMenuItem (label);
    item.addActionListener ( this );
    return item;
  } // makeMenuItem

} // class PopupPanel

 

The applet's interface consists of an instance of a subclass of JPanel called PopupPanel to which two subpanels are added. An instance of a MouseAdapter subclass, using the anonymous inner class technique, is created and added to the MouseListener list of both panels.

Mouse clicks therefore go to the adapter, which looks for the popup menu request. If detected, then an instance of JPopupMenu with the color menu items is displayed. (Systems differ as to whether the popup signal is generated on a mouse button press or release so both are tested here.)

When the user selects an item in the popup menu list, the actionPerformed() method is invoked and the background color is set according to which menu item was selected and over which panel.

Note that you don't have to respond with a JPopupMenu object in response to an affirmative isPopupTrigger() response. You could always open a dialog window, such as one with a JTextField to enter a new value for something clicked on.

 

References & Web Resources

Latest update: Dec. 6, 2004

              Tech
Tech APIs
Exercises

           Physics
Math/Science APIs
JAIDA Program
  Demo 1
Demo 1 Discussion
Exercises

  Part I Part II Part III
Java Core 1  2  3  4  5  6  7  8  9  10  11  12 13 14 15 16 17
18 19 20
21
22 23 24
Supplements

1  2  3  4  5  6  7  8  9  10  11  12

Tech 1  2  3  4  5  6  7  8  9  10  11  12
Physics 1  2  3  4  5  6  7  8  9  10  11  12

Java is a trademark of Sun Microsystems, Inc.