Section 11.12. Multiple-Selection Lists


[Page 549 ( continued )]

11.12. Multiple-Selection Lists

A multiple-selection list enables the user to select many items from a JList (see output of Fig. 11.26). A SINGLE_INTERVAL_SELECTION list allows selecting a contiguous range of items. To do so, click the first item, then press and hold the Shift key while clicking the last item in the range. A MULTIPLE_INTERVAL_SELECTION list allows continuous range selection as described for a SINGLE_INTERVAL_SELECTION list. Such a list allows miscellaneous items to be selected by pressing and holding the Ctrl key (sometimes called the Control key) while clicking each item to select. To deselect an item, press and hold the Ctrl key while clicking the item a second time.

The application of Fig. 11.25 and Fig. 11.26 uses multiple-selection lists to copy items from one JList to another. One list is a MULTIPLE_INTERVAL_SELECTION list and the other is a SINGLE_INTERVAL_SELECTION list. When you execute the application, try using the selection techniques described previously to select items in both lists.

Figure 11.25. JList that allows multiple selections.
(This item is displayed on pages 549 - 550 in the print version)
1

// Fig. 11.25: MultipleSelectionFrame.java

2

// Copying items from one List to another.

3

import

java.awt.FlowLayout;
 4

import

java.awt.event.ActionListener;
 5

import

java.awt.event.ActionEvent;
 6

import

javax.swing.JFrame;
 7

import

javax.swing.JList;
 8

import

javax.swing.JButton;
 9

import

javax.swing.JScrollPane;
10

import

javax.swing.ListSelectionModel;
11
12

public class

MultipleSelectionFrame

extends

JFrame
13  {
14

private

JList colorJList;

// list to hold color names

15

private

JList copyJList;

// list to copy color names into

16

private

JButton copyJButton;

// button to copy selected names

17

private final

String colorNames[] = {

"Black"

,

"Blue"

,

"Cyan"

,
18

"Dark Gray"

,

"Gray"

,

"Green"

,

"Light Gray"

,

"Magenta"

,

"Orange"

,
19

"Pink"

,

"Red"

,

"White"

,

"Yellow"

};
20
21

// MultipleSelectionFrame constructor

22

public

MultipleSelectionFrame()
23     {
24

super

(

"Multiple Selection Lists"

);
25        setLayout(

new

FlowLayout() );

// set frame layout

26
27        colorJList =

new

JList( colorNames );

// holds names of all colors

28        colorJList.setVisibleRowCount(

5

);

// show five rows

29

colorJList.setSelectionMode(

30


ListSelectionModel.MULTIPLE_INTERVAL_SELECTION

);

31        add(

new

JScrollPane( colorJList ) );

// add list with scrollpane

32
33        copyJButton =

new

JButton(

"Copy >>>"

);

// create copy button

34        copyJButton.addActionListener(
35
36

new

ActionListener()

// anonymous inner class

37           {
38

// handle button event

39

public void

actionPerformed( ActionEvent event )
40              {
41

// place selected values in copyJList

42

copyJList.setListData( colorJList.getSelectedValues() );

43              }

// end method actionPerformed

44           }

// end anonymous inner class

45        );

// end call to addActionListener

46
47        add( copyJButton );

// add copy button to JFrame

48
49        copyJList =

new

JList();

// create list to hold copied color names

50        copyJList.setVisibleRowCount(

5

);

// show 5 rows

51

copyJList.setFixedCellWidth(

100

);

// set width


52

copyJList.setFixedCellHeight(

15

);

// set height


53

copyJList.setSelectionMode(

54


ListSelectionModel.SINGLE_INTERVAL_SELECTION

);

55        add(

new

JScrollPane( copyJList ) );

// add list with scrollpane

56     }

// end MultipleSelectionFrame constructor

57  }

// end class MultipleSelectionFrame


Figure 11.26. Test class for MultipleSelectionFrame .
(This item is displayed on pages 550 - 551 in the print version)
1

// Fig. 11.26: MultipleSelectionTest.java

2

// Testing MultipleSelectionFrame.

3

import

javax.swing.JFrame;
 4
 5

public class

MultipleSelectionTest
 6  {
 7

public static void

main( String args[] )
 8     {
 9        MultipleSelectionFrame multipleSelectionFrame =
10

new

MultipleSelectionFrame();
11        multipleSelectionFrame.setDefaultCloseOperation(
12

JFrame.EXIT_ON_CLOSE

);
13        multipleSelectionFrame.setSize(

350

,

140

);

// set frame size

14        multipleSelectionFrame.setVisible(

true

);

// display frame

15     }

// end main

16  }

// end class MultipleSelectionTest



Line 27 of Fig. 11.25 creates JList colorList and initializes it with the strings in the array colorNames . Line 28 sets the number of visible rows in colorList to 5 . Lines 2930 specify that colorList is a MULTIPLE_INTERVAL_SELECTION list. Line 31 adds a new JScrollPane containing colorList to the JFrame . Lines 4955 perform similar tasks for copyList , which is declared as a SINGLE_INTERVAL_SELECTION list. Line 51 uses JList method setFixedCellWidth to set copyList 's width to 100 pixels. Line 52 uses JList method setFixedCellHeight to set the height of each item in the JList to 15 pixels.


[Page 551]

There are no events to indicate that a user has made multiple selections in a multiple-selection list. Normally, an event generated by another GUI component (known as an external event ) specifies when the multiple selections in a JList should be processed . In this example, the user clicks the JButton called copyButton to trigger the event that copies the selected items in colorList to copyList .

Lines 3945 declare, create and register an ActionListener for the copyButton . When the user clicks copyButton , method actionPerformed (lines 3943) uses JList method setListData to set the items displayed in copyList . Line 42 calls colorList 's method getSelectedValues , which returns an array of Object s representing the selected items in colorList . In this example, the returned array is passed as the argument to copyList 's setListData method.

You might be wondering why copyList can be used in line 42 even though the application does not create the object to which it refers until Line 49? Remember that method actionPerformed (lines 3943) does not execute until the user presses the copyButton , which cannot occur until after the constructor completes execution and the application displays the GUI. At that point in the application's execution, copyList is already initialized with a new JList object.