JPopupMenu
Many of today's computer applications provide so-called context-sensitive pop-up menus. In Swing, such menus are created with class JPopupMenu (a subclass of JComponent). These menus provide options that are specific to the component for which the popup trigger event was generated. On most systems, the pop-up trigger event occurs when the user presses and releases the right mouse button.
Look-and-Feel Observation 22.9
The pop-up trigger event is platform specific. On most platforms that use a mouse with multiple buttons, the pop-up trigger event occurs when the user clicks the right mouse button on a component that supports a pop-up menu. |
The application in Figure 22.7 and Fig. 22.8 creates a JPopupMenu that allows the user to select one of three colors and change the background color of the window. When the user clicks the right mouse button on the PopupTest window's background, a JPopupMenu containing colors appears. If the user clicks a JRadioButtonMenuItem for a color, ItemHandler method actionPerformed changes the background color of the window's content pane.
Figure 22.7. JPopupMenu for selecting colors.
(This item is displayed on pages 1020 - 1021 in the print version)
1 // Fig. 22.7: PopupFrame.java 2 // Demonstrating JPopupMenus. 3 import java.awt.Color; 4 import java.awt.event.MouseAdapter; 5 import java.awt.event.MouseEvent; 6 import java.awt.event.ActionListener; 7 import java.awt.event.ActionEvent; 8 import javax.swing.JFrame; 9 import javax.swing.JRadioButtonMenuItem; 10 import javax.swing.JPopupMenu; 11 import javax.swing.ButtonGroup; 12 13 public class PopupFrame extends JFrame 14 { 15 private JRadioButtonMenuItem items[]; // holds items for colors 16 private final Color colorValues[] = 17 { Color.BLUE, Color.YELLOW, Color.RED }; // colors to be used 18 private JPopupMenu popupMenu; // allows user to select color 19 20 // no-argument constructor sets up GUI 21 public PopupFrame() 22 { 23 super( "Using JPopupMenus" ); 24 25 ItemHandler handler = new ItemHandler(); // handler for menu items 26 String colors[] = { "Blue", "Yellow", "Red" }; // array of colors 27 28 ButtonGroup colorGroup = new ButtonGroup(); // manages color items 29 popupMenu = new JPopupMenu(); // create pop-up menu 30 items = new JRadioButtonMenuItem[ 3 ]; // items for selecting color 31 32 // construct menu item, add to popup menu, enable event handling 33 for ( int count = 0; count < items.length; count++ ) 34 { 35 items[ count ] = new JRadioButtonMenuItem( colors[ count ] ); 36 popupMenu.add( items[ count ] ); // add item to pop-up menu 37 colorGroup.add( items[ count ] ); // add item to button group 38 items[ count ].addActionListener( handler ); // add handler 39 } // end for 40 41 setBackground( Color.WHITE ); // set background to white 42 43 // declare a MouseListener for the window to display pop-up menu 44 addMouseListener( 45 46 new MouseAdapter() // anonymous inner class 47 { 48 // handle mouse press event 49 public void mousePressed( MouseEvent event ) 50 { 51 checkForTriggerEvent( event ); // check for trigger 52 } // end method mousePressed 53 54 // handle mouse release event 55 public void mouseReleased( MouseEvent event ) 56 { 57 checkForTriggerEvent( event ); // check for trigger 58 } // end method mouseReleased 59 60 // determine whether event should trigger popup menu 61 private void checkForTriggerEvent( MouseEvent event ) 62 { 63 if ( event.isPopupTrigger() ) 64 popupMenu.show( 65 event.getComponent(), event.getX(), event.getY() ); 66 } // end method checkForTriggerEvent 67 } // end anonymous inner class 68 ); // end call to addMouseListener 69 } // end PopupFrame constructor 70 71 // private inner class to handle menu item events 72 private class ItemHandler implements ActionListener 73 { 74 // process menu item selections 75 public void actionPerformed( ActionEvent event ) 76 { 77 // determine which menu item was selected 78 for ( int i = 0 ; i < items.length; i++ ) 79 { 80 if ( event.getSource() == items[ i ] ) 81 { 82 getContentPane() .setBackground( colorValues[ i ] ); 83 return; 84 } // end if 85 } // end for 86 } // end method actionPerformed 87 } // end private inner class ItemHandler 88 } // end class PopupFrame |
Figure 22.8. Test class for PopupFrame.
(This item is displayed on page 1022 in the print version)
1 // Fig. 22.8: PopupTest.java 2 // Testing PopupFrame. 3 import javax.swing.JFrame; 4 5 public class PopupTest 6 { 7 public static void main( String args[] ) 8 { 9 PopupFrame popupFrame = new PopupFrame(); // create PopupFrame 10 popupFrame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); 11 popupFrame.setSize( 300, 200 ); // set frame size 12 popupFrame.setVisible( true ); // display frame 13 } // end main 14 } // end class PopupTest
|
Line 25 of the PopupFrame constructor (lines 2169) creates an instance of class ItemHandler (declared in lines 7287) that will process the item events from the menu items in the pop-up menu. Line 29 creates the JPopupMenu. The for statement (lines 3339) creates a JRadioButtonMenuItem object (line 35), adds it to popupMenu (line 36), adds it to ButtonGroup colorGroup (line 37) to maintain one selected JRadioButtonMenuItem at a time and registers its ActionListener (line 38). Line 41 sets the initial background to white by invoking method setBackground.
Lines 4468 register a MouseListener to handle the mouse events of the application window. Methods mousePressed (lines 4952) and mouseReleased (lines 5558) check for the pop-up trigger event. Each method calls private utility method checkForTriggerEvent (lines 6166) to determine whether the pop-up trigger event occurred. If it did, MouseEvent method isPopupTrigger returns TRue, and JPopupMenu method show displays the JPopupMenu. The first argument to method show specifies the origin component, whose position helps determine where the JPopupMenu will appear on the screen. The last two arguments are the x-y coordinates (measured from the origin component's upper-left corner) at which the JPopupMenu is to appear.
Look-and-Feel Observation 22.10
Displaying a JPopupMenu for the pop-up trigger event of multiple GUI components requires registering mouse-event handlers for each of those GUI components. |
When the user selects a menu item from the pop-up menu, class ItemHandler's method actionPerformed (lines 7586) determines which JRadioButtonMenuItem the user selected and sets the background color of the window's content pane.