1 package prefuse.util.ui; 2 3 import javax.swing.JFrame ; 4 import javax.swing.JScrollPane ; 5 import javax.swing.JTable ; 6 import javax.swing.event.TableModelEvent ; 7 import javax.swing.event.TableModelListener ; 8 import javax.swing.table.DefaultTableCellRenderer ; 9 import javax.swing.table.TableCellRenderer ; 10 import javax.swing.table.TableModel ; 11 12 import prefuse.data.Table; 13 import prefuse.data.event.EventConstants; 14 import prefuse.data.event.TableListener; 15 import prefuse.util.StringLib; 16 import prefuse.util.collections.CopyOnWriteArrayList; 17 import prefuse.util.collections.IntIterator; 18 import prefuse.visual.VisualTable; 19 20 26 public class JPrefuseTable extends JTable { 27 28 private Table m_table; 29 private TableCellRenderer m_tcr = new DefaultTableCellRenderer (); 30 31 35 public JPrefuseTable(Table t) { 36 super(); 37 m_table = t; 38 39 PrefuseTableModel model = new PrefuseTableModel(); 40 super.setModel(model); 41 m_table.addTableListener(model); 42 } 43 44 48 public Table getTable() { 49 return m_table; 50 } 51 52 56 public TableCellRenderer getCellRenderer(int r, int c) { 57 return m_tcr; 58 } 59 60 62 66 public class PrefuseTableModel implements TableModel , TableListener { 67 68 private CopyOnWriteArrayList m_listeners = new CopyOnWriteArrayList(); 69 private int[] m_rowmap; 70 71 75 private void initRowMap() { 76 m_rowmap = new int[m_table.getRowCount()]; 77 IntIterator rows = m_table.rows(); 78 for ( int i=0; rows.hasNext(); ++i ) { 79 m_rowmap[i] = rows.nextInt(); 80 } 81 } 82 83 88 private int getRow(int rowIndex) { 89 if ( m_rowmap == null ) 90 initRowMap(); 91 return m_rowmap[rowIndex]; 92 } 93 94 96 99 public int getColumnCount() { 100 return m_table.getColumnCount(); 101 } 102 105 public int getRowCount() { 106 return m_table.getRowCount(); 107 } 108 111 public boolean isCellEditable(int rowIndex, int columnIndex) { 112 return m_table.isCellEditable(rowIndex, columnIndex); 113 } 114 117 public Class getColumnClass(int columnIndex) { 118 return m_table.getColumnType(columnIndex); 119 } 120 123 public Object getValueAt(int rowIndex, int columnIndex) { 124 Object o = m_table.get(getRow(rowIndex), columnIndex); 125 if ( o != null && o.getClass().isArray() ) { 126 return StringLib.getArrayString(o); 127 } else { 128 return o; 129 } 130 } 131 134 public void setValueAt(Object aValue, int rowIndex, int columnIndex) { 135 m_table.set(getRow(rowIndex), columnIndex, aValue); 136 } 137 140 public String getColumnName(int columnIndex) { 141 return m_table.getColumnName(columnIndex); 142 } 143 144 146 149 public void addTableModelListener(TableModelListener l) { 150 m_listeners.add(l); 151 } 152 155 public void removeTableModelListener(TableModelListener l) { 156 m_listeners.remove(l); 157 } 158 159 162 public void tableChanged(Table t, int start, int end, int col, int type) { 163 if ( type == EventConstants.INSERT || type == EventConstants.DELETE ) 164 m_rowmap = null; 166 Object [] lstnrs = m_listeners.getArray(); 167 if ( lstnrs.length == 0 ) 168 return; 169 170 TableModelEvent evt 171 = new TableModelEvent (this, start, end, col, type); 172 for ( int i=0; i<lstnrs.length; ++i ) { 173 ((TableModelListener )lstnrs[i]).tableChanged(evt); 174 } 175 } 176 177 } 179 181 187 public static JFrame showTableWindow(Table t) { 188 JPrefuseTable table = new JPrefuseTable(t); 189 String title = t.toString(); 190 if ( t instanceof VisualTable ) { 191 title = ((VisualTable)t).getGroup() + " " + title; 192 } 193 JFrame frame = new JFrame (title); 194 frame.getContentPane().add(new JScrollPane (table)); 195 frame.pack(); 196 frame.setVisible(true); 197 return frame; 198 } 199 200 } | Popular Tags |