Java tutorial
/* 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; } } }