Mega Code Archive

 
Categories / Java Tutorial / Swing Event
 

ListSelectionModel and ListSelectionListener

/*  * Copyright (c) 1995 - 2008 Sun Microsystems, Inc.  All rights reserved.  *  * Redistribution and use in source and binary forms, with or without  * modification, are permitted provided that the following conditions  * are met:  *  *   - Redistributions of source code must retain the above copyright  *     notice, this list of conditions and the following disclaimer.  *  *   - Redistributions in binary form must reproduce the above copyright  *     notice, this list of conditions and the following disclaimer in the  *     documentation and/or other materials provided with the distribution.  *  *   - Neither the name of Sun Microsystems nor the names of its  *     contributors may be used to endorse or promote products derived  *     from this software without specific prior written permission.  *  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS  * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  */ /*  * ListSelectionDemo.java requires no other files.  */ import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.BorderFactory; import javax.swing.BoxLayout; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JSplitPane; import javax.swing.JTable; import javax.swing.JTextArea; import javax.swing.ListSelectionModel; import javax.swing.ScrollPaneConstants; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; public class ListSelectionDemo extends JPanel {   JTextArea output;   JList list;   JTable table;   String newline = "\n";   ListSelectionModel listSelectionModel;   public ListSelectionDemo() {     super(new BorderLayout());     String[] listData = { "one", "two", "three", "four", "five", "six", "seven" };     String[] columnNames = { "French", "Spanish", "Italian" };     list = new JList(listData);     listSelectionModel = list.getSelectionModel();     listSelectionModel         .addListSelectionListener(new SharedListSelectionHandler());     JScrollPane listPane = new JScrollPane(list);     JPanel controlPane = new JPanel();     String[] modes = { "SINGLE_SELECTION", "SINGLE_INTERVAL_SELECTION",         "MULTIPLE_INTERVAL_SELECTION" };     final JComboBox comboBox = new JComboBox(modes);     comboBox.setSelectedIndex(2);     comboBox.addActionListener(new ActionListener() {       public void actionPerformed(ActionEvent e) {         String newMode = (String) comboBox.getSelectedItem();         if (newMode.equals("SINGLE_SELECTION")) {           listSelectionModel               .setSelectionMode(ListSelectionModel.SINGLE_SELECTION);         } else if (newMode.equals("SINGLE_INTERVAL_SELECTION")) {           listSelectionModel               .setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);         } else {           listSelectionModel               .setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);         }         output.append("----------" + "Mode: " + newMode + "----------"             + newline);       }     });     controlPane.add(new JLabel("Selection mode:"));     controlPane.add(comboBox);     // Build output area.     output = new JTextArea(1, 10);     output.setEditable(false);     JScrollPane outputPane = new JScrollPane(output,         ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS,         ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);     // Do the layout.     JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT);     add(splitPane, BorderLayout.CENTER);     JPanel topHalf = new JPanel();     topHalf.setLayout(new BoxLayout(topHalf, BoxLayout.LINE_AXIS));     JPanel listContainer = new JPanel(new GridLayout(1, 1));     listContainer.setBorder(BorderFactory.createTitledBorder("List"));     listContainer.add(listPane);     topHalf.setBorder(BorderFactory.createEmptyBorder(5, 5, 0, 5));     topHalf.add(listContainer);     // topHalf.add(tableContainer);     topHalf.setMinimumSize(new Dimension(100, 50));     topHalf.setPreferredSize(new Dimension(100, 110));     splitPane.add(topHalf);     JPanel bottomHalf = new JPanel(new BorderLayout());     bottomHalf.add(controlPane, BorderLayout.PAGE_START);     bottomHalf.add(outputPane, BorderLayout.CENTER);     // XXX: next line needed if bottomHalf is a scroll pane:     // bottomHalf.setMinimumSize(new Dimension(400, 50));     bottomHalf.setPreferredSize(new Dimension(450, 135));     splitPane.add(bottomHalf);   }   /**    * Create the GUI and show it. For thread safety, this method should be    * invoked from the event-dispatching thread.    */   private static void createAndShowGUI() {     // Create and set up the window.     JFrame frame = new JFrame("ListSelectionDemo");     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);     // Create and set up the content pane.     ListSelectionDemo demo = new ListSelectionDemo();     demo.setOpaque(true);     frame.setContentPane(demo);     // Display the window.     frame.pack();     frame.setVisible(true);   }   public static void main(String[] args) {     // Schedule a job for the event-dispatching thread:     // creating and showing this application's GUI.     javax.swing.SwingUtilities.invokeLater(new Runnable() {       public void run() {         createAndShowGUI();       }     });   }   class SharedListSelectionHandler implements ListSelectionListener {     public void valueChanged(ListSelectionEvent e) {       ListSelectionModel lsm = (ListSelectionModel) e.getSource();       int firstIndex = e.getFirstIndex();       int lastIndex = e.getLastIndex();       boolean isAdjusting = e.getValueIsAdjusting();       output.append("Event for indexes " + firstIndex + " - " + lastIndex           + "; isAdjusting is " + isAdjusting + "; selected indexes:");       if (lsm.isSelectionEmpty()) {         output.append(" <none>");       } else {         // Find out which indexes are selected.         int minIndex = lsm.getMinSelectionIndex();         int maxIndex = lsm.getMaxSelectionIndex();         for (int i = minIndex; i <= maxIndex; i++) {           if (lsm.isSelectedIndex(i)) {             output.append(" " + i);           }         }       }       output.append(newline);       output.setCaretPosition(output.getDocument().getLength());     }   } }