Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Intro_Java_brief_Liang2011.pdf
Скачиваний:
195
Добавлен:
26.03.2016
Размер:
10.44 Mб
Скачать

590 Chapter 17 Creating Graphical User Interfaces

17.8 Combo Boxes

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 17.21 lists several frequently used constructors and methods in JComboBox.

FIGURE 17.21 JComboBox enables you to select an item from a set of items.

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 fire ActionEvent and ItemEvent, among many other events. Whenever an item is selected, an ActionEvent is fired. Whenever a new item is selected, JComboBox fires 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 17.8 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 17.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

17.8 Combo Boxes 591

Combo box

DescriptionPanel

FIGURE 17.22 A country’s info, including a flag image and a description of the flag, is displayed when the country is selected in the combo box.

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.

LISTING 17.8 ComboBoxDemo.java

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

12private ImageIcon[] flagImage = {

13new ImageIcon("image/ca.gif"),

14new ImageIcon("image/china.gif"),

15new ImageIcon("image/denmark.gif"),

16new ImageIcon("image/fr.gif"),

17new ImageIcon("image/germany.gif"),

18new ImageIcon("image/india.gif"),

19new ImageIcon("image/norway.gif"),

20new ImageIcon("image/uk.gif"),

21new ImageIcon("image/us.gif")

22};

23

24// Declare an array of strings for flag descriptions

25private String[] flagDescription = new String[9];

27// Declare and create a description panel

28private DescriptionPanel descriptionPanel = new DescriptionPanel();

30// Create a combo box for selecting countries

31 private JComboBox jcbo = new JComboBox(flagTitles);

32

33public static void main(String[] args) {

34ComboBoxDemo frame = new ComboBoxDemo();

country

image icon

description

combo box

592 Chapter 17

Creating Graphical User Interfaces

 

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[0] = "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

"maple leaf 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(0);

 

64

 

 

65

// Add combo box and description panel to the list

create UI

66

add(jcbo, BorderLayout.NORTH);

 

67

add(descriptionPanel, BorderLayout.CENTER);

 

68

 

 

69

// Register listener

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.

17.9 Lists 593

The program creates an instance of DescriptionPanel (line 28), which was presented in Listing 17.6, DescriptionPanel.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.

17.9 Lists

A list is a component that basically performs the same function as a combo box but enables the user to choose a single value or multiple values. The Swing JList is very versatile. Figure 17.23 lists several frequently used constructors and methods in JList.

javax.swing.JComponent

The get and set methods for these data fields are provided in the class, but omitted in the UML diagram for brevity.

javax.swing.JList

-selectedIndex: int -selectedIndices: int[] -selectedValue: Object -visibleRowCount: int

-selectionBackground: Color -selectionForeground: Color -selectionMode: int

+JList()

+JList(items: Object[])

+addListSelectionListener(listener: ListSelectionListener): void

FIGURE 17.23 JList enables you to select multiple items from a set of items.

selectionMode is one of the three values (SINGLE_SELECTION, SINGLE_INTERVAL _SELECTION, MULTIPLE_INTERVAL_SELECTION) defined in javax.swing.ListSelectionModel that indicate whether a single item, single-interval item, or multiple-interval item can be selected. Single selection allows only one item to be selected. Single-interval selection allows multiple selections, but the selected items must be contiguous. Multipleinterval selection allows selections of multiple contiguous items without restrictions, as shown in Figure 17.24. The default value is MULTIPLE_INTERVAL_SELECTION.

(a) Single selection

(b) Single-interval

(c) Multiple-interval

 

selection

selection

FIGURE 17.24 JList has three selection modes: single selection, single-interval selection, and multiple-interval selection.

594 Chapter 17 Creating Graphical User Interfaces

JList inside a scroll

pane

The following statements create a list with six items, red foreground, white background, pink selection foreground, black selection background, and visible row count 4.

JList jlst = new JList(new Object[]

{"Item 1", "Item 2", "Item 3", "Item 4", "Item 5", "Item 6"}); jlst.setForeground(Color.RED);

jlst.setBackground(Color.WHITE);

jlst.setSelectionForeground(Color.PINK);

jlst.setSelectionBackground(Color.BLACK); jlst.setVisibleRowCount(4);

Lists do not scroll automatically. To make a list scrollable, create a scroll pane and add the list to it.

JList fires javax.swing.event.ListSelectionEvent to notify the listeners of the selections. The listener must implement the valueChanged handler in the javax.swing.event.ListSelectionListener interface to process the event.

Listing 17.9 gives a program that lets users select countries in a list and display the flags of the selected countries in the labels. Figure 17.25 shows a sample run of the program.

JPanel with

GridLayout

An image is displayed on a

Jlabel

FIGURE 17.25 When the countries in the list are selected, corresponding images of their flags are displayed in the labels.

Here are the major steps in the program:

1.Create the user interface.

Create a list with nine country names as selection values, and place the list inside a scroll pane. Place the scroll pane in the west of the frame. Create nine labels to be used to display the countries’ flag images. Place the labels in the panel, and place the panel in the center of the frame.

2.Process the event.

Create a listener to implement the valueChanged method in the ListSelectionListener interface to set the selected countries’ flag images in the labels.

LISTING 17.9 ListDemo.java

1 import java.awt.*;

2 import javax.swing.*;

3 import javax.swing.event.*;

4

5 public class ListDemo extends JFrame { 6 final int NUMBER_OF_FLAGS = 9;

7

8// Declare an array of Strings for flag titles

9private String[] flagTitles = {"Canada", "China", "Denmark",

17.9 Lists 595

10"France", "Germany", "India", "Norway", "United Kingdom",

11"United States of America"};

12

13// The list for selecting countries

14private JList jlst = new JList(flagTitles);

15

16// Declare an ImageIcon array for the national flags of 9 countries

17private ImageIcon[] imageIcons = {

18new ImageIcon("image/ca.gif"),

19new ImageIcon("image/china.gif"),

20new ImageIcon("image/denmark.gif"),

21new ImageIcon("image/fr.gif"),

22new ImageIcon("image/germany.gif"),

23new ImageIcon("image/india.gif"),

24new ImageIcon("image/norway.gif"),

25new ImageIcon("image/uk.gif"),

26new ImageIcon("image/us.gif")

27};

28

29// Arrays of labels for displaying images

30private JLabel[] jlblImageViewer = new JLabel[NUMBER_OF_FLAGS];

32public static void main(String[] args) {

33

ListDemo frame = new ListDemo();

create frame

34frame.setSize(650, 500);

35frame.setTitle("ListDemo");

36frame.setLocationRelativeTo(null); // Center the frame

37frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

38frame.setVisible(true);

39}

40

41public ListDemo() {

42// Create a panel to hold nine labels

43

JPanel p = new JPanel(new GridLayout(3, 3, 5, 5));

create UI

44

 

 

45for (int i = 0; i < NUMBER_OF_FLAGS; i++) {

46p.add(jlblImageViewer[i] = new JLabel());

47jlblImageViewer[i].setHorizontalAlignment

48(SwingConstants.CENTER);

49}

50

51// Add p and the list to the frame

52add(p, BorderLayout.CENTER);

53add(new JScrollPane(jlst), BorderLayout.WEST);

55// Register listeners

56jlst.addListSelectionListener(new ListSelectionListener() {

57/** Handle list selection */

58

public void valueChanged(ListSelectionEvent e) {

event handler

59// Get selected indices

60int[] indices = jlst.getSelectedIndices();

62int i;

63// Set icons in the labels

64for (i = 0; i < indices.length; i++) {

65jlblImageViewer[i].setIcon(imageIcons[indices[i]]);

66}

67

68// Remove icons from the rest of the labels

69for (; i < NUMBER_OF_FLAGS; i++) {

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]