import javax.swing.JTable; import javax.swing.ListSelectionModel; import javax.swing.event.ListSelectionListener; import javax.swing.event.ListSelectionEvent; import javax.swing.JScrollPane; import javax.swing.JPanel; import javax.swing.JFrame; import java.awt.*; import java.awt.event.*; /** * This demo from the Sun Java Tutorial on Tables was modifed * by JD 11/2000 to demonstrate how to select a range of columns in a single row. * My changes indicated by comments with initials JD. * Version History: * 11/27/2000 Added asterisks to selected cells */ public class SimpleTableSelectionDemo extends JFrame { private boolean DEBUG = false; private boolean ALLOW_COLUMN_SELECTION = true; //JD private boolean ALLOW_ROW_SELECTION = true; int selectedRow; public SimpleTableSelectionDemo() { super("SimpleTableSelectionDemo"); Object[][] data = { {"Mary", "Campione", "Snowboarding", new Integer(5), new Boolean(false)}, {"Alison", "Huml", "Rowing", new Integer(3), new Boolean(true)}, {"Kathy", "Walrath", "Chasing toddlers", new Integer(2), new Boolean(false)}, {"Mark", "Andrews", "Speed reading", new Integer(20), new Boolean(true)}, {"Angela", "Lih", "Teaching high school", new Integer(4), new Boolean(false)} }; String[] columnNames = {"First Name", "Last Name", "Sport", "# of Years", "Vegetarian"}; final JTable table = new JTable(data, columnNames); table.setPreferredScrollableViewportSize(new Dimension(500, 70)); // The selection mode for columns was changed from SINGLE to SINGLE_INTERVAL table.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION); //JD // The following line was moved from below (where indicated by asterisks) //JD ListSelectionModel rowSM = table.getSelectionModel(); // This line was added so the rows use a different selection mode than the columns. //JD rowSM.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); //JD if (ALLOW_ROW_SELECTION) { // true by default // *** declaration of rowSM moved from here --JD rowSM.addListSelectionListener(new ListSelectionListener() { public void valueChanged(ListSelectionEvent e) { //Ignore extra messages. if (e.getValueIsAdjusting()) return; ListSelectionModel lsm = (ListSelectionModel)e.getSource(); if (lsm.isSelectionEmpty()) { System.out.println("No rows are selected."); } else { selectedRow = lsm.getMinSelectionIndex(); System.out.println("Row " + selectedRow + " is now selected."); } } }); } else { table.setRowSelectionAllowed(false); } if (ALLOW_COLUMN_SELECTION) { // false by default if (ALLOW_ROW_SELECTION) { //We allow both row and column selection, which //implies that we *really* want to allow individual //cell selection. table.setCellSelectionEnabled(true); } table.setColumnSelectionAllowed(true); ListSelectionModel colSM = table.getColumnModel().getSelectionModel(); colSM.addListSelectionListener(new ListSelectionListener() { public void valueChanged(ListSelectionEvent e) { //Ignore extra messages. if (e.getValueIsAdjusting()) return; ListSelectionModel lsm = (ListSelectionModel)e.getSource(); if (lsm.isSelectionEmpty()) { System.out.println("No columns are selected."); } else { // Obtain the bounds of the selected area int startCol = lsm.getMinSelectionIndex(); int endCol = lsm.getMaxSelectionIndex(); System.out.println("Column " + startCol + "-" + endCol + " are now selected."); // Put an asterisk into each selected cell for (int col=startCol;col<=endCol;col++) { table.setValueAt("*", selectedRow, col); } } } }); } if (DEBUG) { table.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { printDebugData(table); } }); } //Create the scroll pane and add the table to it. JScrollPane scrollPane = new JScrollPane(table); //Add the scroll pane to this window. getContentPane().add(scrollPane, BorderLayout.CENTER); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); } private void printDebugData(JTable table) { int numRows = table.getRowCount(); int numCols = table.getColumnCount(); javax.swing.table.TableModel model = table.getModel(); System.out.println("Value of data: "); for (int i=0; i < numRows; i++) { System.out.print(" row " + i + ":"); for (int j=0; j < numCols; j++) { System.out.print(" " + model.getValueAt(i, j)); } System.out.println(); } System.out.println("--------------------------"); } public static void main(String[] args) { SimpleTableSelectionDemo frame = new SimpleTableSelectionDemo(); frame.pack(); frame.setVisible(true); } }