SelectionExample.java Source code

Java tutorial

Introduction

Here is the source code for SelectionExample.java

Source

/*
Java Swing, 2nd Edition
By Marc Loy, Robert Eckstein, Dave Wood, James Elliott, Brian Cole
ISBN: 0-596-00408-7
Publisher: O'Reilly 
*/
// SelectionExample.java
//A simple multiplication table with the ability to play with row and column
//selections. You can alter the cell, column and row selection properties
//of the table at runtime.
//

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableModel;

public class SelectionExample extends JFrame {

    public SelectionExample() {
        super("Selection Model Test");
        setSize(450, 350);
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        TableModel tm = new AbstractTableModel() {
            // We'll create a simple multiplication table to serve as a
            // noneditable
            // table with several rows and columns
            public int getRowCount() {
                return 10;
            }

            public int getColumnCount() {
                return 10;
            }

            public Object getValueAt(int r, int c) {
                return "" + (r + 1) * (c + 1);
            }
        };

        final JTable jt = new JTable(tm);

        JScrollPane jsp = new JScrollPane(jt);
        getContentPane().add(jsp, BorderLayout.CENTER);

        // Now set up our selection controls
        JPanel controlPanel, buttonPanel, columnPanel, rowPanel;

        buttonPanel = new JPanel();
        final JCheckBox cellBox, columnBox, rowBox;
        cellBox = new JCheckBox("Cells", jt.getCellSelectionEnabled());
        columnBox = new JCheckBox("Columns", jt.getColumnSelectionAllowed());
        rowBox = new JCheckBox("Rows", jt.getRowSelectionAllowed());
        cellBox.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent ae) {
                jt.setCellSelectionEnabled(cellBox.isSelected());
                columnBox.setSelected(jt.getColumnSelectionAllowed());
                rowBox.setSelected(jt.getRowSelectionAllowed());
            }
        });

        columnBox.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent ae) {
                jt.setColumnSelectionAllowed(columnBox.isSelected());
                cellBox.setSelected(jt.getCellSelectionEnabled());
            }
        });

        rowBox.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent ae) {
                jt.setRowSelectionAllowed(rowBox.isSelected());
                cellBox.setSelected(jt.getCellSelectionEnabled());
            }
        });

        buttonPanel.add(new JLabel("Selections allowed:"));
        buttonPanel.add(cellBox);
        buttonPanel.add(columnBox);
        buttonPanel.add(rowBox);

        columnPanel = new JPanel();
        ListSelectionModel csm = jt.getColumnModel().getSelectionModel();
        JLabel columnCounter = new JLabel("(Selected Column Indices Go Here)");
        csm.addListSelectionListener(new SelectionDebugger(columnCounter, csm));
        columnPanel.add(new JLabel("Selected columns:"));
        columnPanel.add(columnCounter);

        rowPanel = new JPanel();
        ListSelectionModel rsm = jt.getSelectionModel();
        JLabel rowCounter = new JLabel("(Selected Row Indices Go Here)");
        rsm.addListSelectionListener(new SelectionDebugger(rowCounter, rsm));
        rowPanel.add(new JLabel("Selected rows:"));
        rowPanel.add(rowCounter);

        controlPanel = new JPanel(new GridLayout(0, 1));
        controlPanel.add(buttonPanel);
        controlPanel.add(columnPanel);
        controlPanel.add(rowPanel);

        getContentPane().add(controlPanel, BorderLayout.SOUTH);
    }

    public static void main(String args[]) {
        SelectionExample se = new SelectionExample();
        se.setVisible(true);
    }

    public class SelectionDebugger implements ListSelectionListener {
        JLabel debugger;

        ListSelectionModel model;

        public SelectionDebugger(JLabel target, ListSelectionModel lsm) {
            debugger = target;
            model = lsm;
        }

        public void valueChanged(ListSelectionEvent lse) {
            if (!lse.getValueIsAdjusting()) {
                // skip all the intermediate events . . .
                StringBuffer buf = new StringBuffer();
                int[] selection = getSelectedIndices(model.getMinSelectionIndex(), model.getMaxSelectionIndex());
                if (selection.length == 0) {
                    buf.append("none");
                } else {
                    for (int i = 0; i < selection.length - 1; i++) {
                        buf.append(selection[i]);
                        buf.append(", ");
                    }
                    buf.append(selection[selection.length - 1]);
                }
                debugger.setText(buf.toString());
            }
        }

        // This method returns an array of selected indices. It's guaranteed to
        // return a nonnull value.
        protected int[] getSelectedIndices(int start, int stop) {
            if ((start == -1) || (stop == -1)) {
                // no selection, so return an empty array
                return new int[0];
            }

            int guesses[] = new int[stop - start + 1];
            int index = 0;
            // manually walk through these . . .
            for (int i = start; i <= stop; i++) {
                if (model.isSelectedIndex(i)) {
                    guesses[index++] = i;
                }
            }

            // ok, pare down the guess array to the real thing
            int realthing[] = new int[index];
            System.arraycopy(guesses, 0, realthing, 0, index);
            return realthing;
        }
    }
}