Mega Code Archive

 
Categories / Java / Swing JFC
 

A row header column with the TableColumnModel

/* Java Swing, 2nd Edition By Marc Loy, Robert Eckstein, Dave Wood, James Elliott, Brian Cole ISBN: 0-596-00408-7 Publisher: O'Reilly  */ // RowHeaderTable.java //A simple application that demonstrates the use of the TableColumnModel //class to build a row header column that scrolls with the regular data //rows. // import java.awt.BorderLayout; import java.awt.Color; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.JViewport; import javax.swing.ScrollPaneConstants; import javax.swing.table.AbstractTableModel; import javax.swing.table.DefaultTableColumnModel; import javax.swing.table.TableColumn; import javax.swing.table.TableColumnModel; import javax.swing.table.TableModel; public class RowHeaderTable extends JFrame {   public RowHeaderTable() {     super("Row Header Test");     setSize(300, 200);     setDefaultCloseOperation(EXIT_ON_CLOSE);     TableModel tm = new AbstractTableModel() {       String data[] = { "", "a", "b", "c", "d", "e" };       String headers[] = { "Row #", "Column 1", "Column 2", "Column 3",           "Column 4", "Column 5" };       public int getColumnCount() {         return data.length;       }       public int getRowCount() {         return 1000;       }       public String getColumnName(int col) {         return headers[col];       }       // Synthesize some entries using the data values & the row #       public Object getValueAt(int row, int col) {         return data[col] + row;       }     };     // Create a column model for the main table. This model ignores the     // first     // column added, and sets a minimum width of 150 pixels for all others.     TableColumnModel cm = new DefaultTableColumnModel() {       boolean first = true;       public void addColumn(TableColumn tc) {         // Drop the first column . . . that'll be the row header         if (first) {           first = false;           return;         }         tc.setMinWidth(150); // just for looks, really...         super.addColumn(tc);       }     };     // Create a column model that will serve as our row header table. This     // model picks a maximum width and only stores the first column.     TableColumnModel rowHeaderModel = new DefaultTableColumnModel() {       boolean first = true;       public void addColumn(TableColumn tc) {         if (first) {           tc.setMaxWidth(tc.getPreferredWidth());           super.addColumn(tc);           first = false;         }         // Drop the rest of the columns . . . this is the header column         // only       }     };     JTable jt = new JTable(tm, cm);     // Set up the header column and get it hooked up to everything     JTable headerColumn = new JTable(tm, rowHeaderModel);     jt.createDefaultColumnsFromModel();     headerColumn.createDefaultColumnsFromModel();     // Make sure that selections between the main table and the header stay     // in sync (by sharing the same model)     jt.setSelectionModel(headerColumn.getSelectionModel());     // Make the header column look pretty     //headerColumn.setBorder(BorderFactory.createEtchedBorder());     headerColumn.setBackground(Color.lightGray);     headerColumn.setColumnSelectionAllowed(false);     headerColumn.setCellSelectionEnabled(false);     // Put it in a viewport that we can control a bit     JViewport jv = new JViewport();     jv.setView(headerColumn);     jv.setPreferredSize(headerColumn.getMaximumSize());     // With out shutting off autoResizeMode, our tables won't scroll     // correctly (horizontally, anyway)     jt.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);     // We have to manually attach the row headers, but after that, the     // scroll     // pane keeps them in sync     JScrollPane jsp = new JScrollPane(jt);     jsp.setRowHeader(jv);     jsp.setCorner(ScrollPaneConstants.UPPER_LEFT_CORNER, headerColumn         .getTableHeader());     getContentPane().add(jsp, BorderLayout.CENTER);   }   public static void main(String args[]) {     RowHeaderTable rht = new RowHeaderTable();     rht.setVisible(true);   } }