A combo box , also known as a choice list or drop-down list , contains a list of items from which the user can choose. It is useful in limiting a user 's range of choices and avoids the cumbersome validation of data input. Figure 15.21 lists several frequently used constructors and methods in JComboBox .
The following statements create a combo box with four items, red foreground, white background, and the second item selected:
JComboBox jcb = new JComboBox( new Object[] { "Item 1" , "Item 2" , "Item 3" , "Item 4" }); jcb.setForeground(Color.red); jcb.setBackground(Color.white); jcb.setSelectedItem( "Item 2" );
JComboBox can generate ActionEvent and ItemEvent , among many other events. Whenever an item is selected, an ActionEvent is fired . Whenever a new item is selected, JComboBox generates ItemEvent twice, once for deselecting the previously selected item, and the other for selecting the currently selected item. Note that no ItemEvent is fired if the current item is reselected. To respond to an ItemEvent , you need to implement the itemStateChanged(ItemEvent e) handler for processing a choice. To get data from a JComboBox menu, you can use getSelectedItem() to return the currently selected item, or e.getItem() method to get the item from the itemStateChanged(ItemEvent e) handler.
Listing 15.7 gives a program that lets users view an image and a description of a country's flag by selecting the country from a combo box, as shown in Figure 15.22.
Here are the major steps in the program:
1. | Create the user interface. Create a combo box with country names as its selection values. Create a DescriptionPanel object. The DescriptionPanel class was introduced in the preceding example. Place the combo box in the north of the frame and the description panel in the center of the frame. |
2. | Process the event. Create a listener to implement the itemStateChanged handler to set the flag title, image, and text in the description panel for the selected country name . |
1 import java.awt.*; 2 import java.awt.event.*; 3 import javax.swing.*; 4 5 public class ComboBoxDemo extends JFrame { 6 // Declare an array of Strings for flag titles 7 private String[] flagTitles = { "Canada" , "China" , "Denmark" , 8 "France" , " Germany " , "India" , "Norway" , "United Kingdom" , 9 "United States of America" }; 10 11 // Declare an ImageIcon array for the national flags of 9 countries 12 private ImageIcon[] flagImage = { 13 new ImageIcon( "image/ca.gif" ), 14 new ImageIcon( "image/china.gif" ), 15 new ImageIcon( "image/denmark.gif" ), 16 new ImageIcon( "image/fr.gif" ), 17 new ImageIcon( "image/germany.gif" ), 18 new ImageIcon( "image/india.gif" ), 19 new ImageIcon( "image/norway.gif" ), 20 new ImageIcon( "image/uk.gif" ), 21 new ImageIcon( "image/us.gif" ) 22 }; 23 24 // Declare an array of strings for flag descriptions 25 private String[] flagDescription = new String[ 9 ]; 26 27 // Declare and create a description panel 28 private DescriptionPanel descriptionPanel = new DescriptionPanel(); 29 30 // Create a combo box for selecting countries 31 private JComboBox jcbo = new JComboBox(flagTitles); 32 33 public static void main(String[] args) { 34 ComboBoxDemo frame = new ComboBoxDemo(); 35 frame.pack(); 36 frame.setTitle( "ComboBoxDemo" ); 37 frame.setLocationRelativeTo(null); // Center the frame 38 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 39 frame.setVisible( true ); 40 } 41 42 public ComboBoxDemo() { 43 // Set text description 44 flagDescription[ ] = "The Maple Leaf flag \n\n" + 45 "The Canadian National Flag was adopted by the Canadian " + 46 "Parliament on October 22, 1964 and was proclaimed into law " + 47 "by Her Majesty Queen Elizabeth II (the Queen of Canada) on " + 48 "February 15, 1965. The Canadian Flag (colloquially known " + 49 "as The Maple Leaf Flag) is a red flag of the proportions " + 50 "two by length and one by width, containing in its center a " + 51 "white square, with a single red stylized eleven-point " + 52 "mapleleaf centered in the white square." ; 53 flagDescription[ 1 ] = "Description for China ... " ; 54 flagDescription[ 2 ] = "Description for Denmark ... " ; 55 flagDescription[ 3 ] = "Description for France ... " ; 56 flagDescription[ 4 ] = "Description for Germany ... " ; 57 flagDescription[ 5 ] = "Description for India ... " ; 58 flagDescription[ 6 ] = "Description for Norway ... " ; 59 flagDescription[ 7 ] = "Description for UK ... " ; 60 flagDescription[ 8 ] = "Description for US ... " ; 61 62 // Set the first country (Canada) for display 63 setDisplay( ); 64 65 // Add combo box and description panel to the list 66 add(jcbo, BorderLayout.NORTH); 67 add(descriptionPanel, BorderLayout.CENTER); 68 69 // Register listener 70 jcbo.addItemListener( new ItemListener() { 71 /** Handle item selection */ 72 public void itemStateChanged(ItemEvent e) { 73 setDisplay(jcbo.getSelectedIndex()); 74 } 75 }); 76 } 77 78 /** Set display information on the description panel */ 79 public void setDisplay( int index) { 80 descriptionPanel.setTitle(flagTitles[index]); 81 descriptionPanel.setImageIcon(flagImage[index]); 82 descriptionPanel.setDescription(flagDescription[index]); 83 } 84 } |
The listener listens to ItemEvent from the combo box and implements ItemListener (lines 70 “75). Instead of using ItemEvent , you may rewrite the program to use ActionEvent for handling combo box item selection.
The program stores the flag information in three arrays: flagTitles , flagImage , and flagDescription (lines 7 “25). The array flagTitles contains the names of nine countries, the array flagImage contains images of the nine countries' flags, and the array flagDescription contains descriptions of the flags.
The program creates an instance of DescriptionPanel (line 28), which was presented in Listing 15.6, TextAreaDemo.java. The program creates a combo box with initial values from flagTitles (line 31). When the user selects an item in the combo box, the ItemStateChanged handler is executed, finds the selected index, and sets its corresponding flag title, flag image, and flag description on the panel.