package org.freehep.swing; import javax.swing.JTable; import javax.swing.table.TableCellEditor; import javax.swing.table.TableCellRenderer; import javax.swing.table.TableModel; /** * This class extends JTable by modifying the lookup of the CellEditors and * CellRenderers. Normally this is done based on the declared class of the * column. However, this behavior is not very convient when the types in a * column can vary from row to row--as happens, for example, with property * sheets. * * @version $Id: CellOrientatedTable.java 8584 2006-08-10 23:06:37Z duns $ * @author Charles Loomis */ public class CellOrientatedTable extends JTable { private boolean tryInterfaces; /** * Create a CellOrientatedTable which doesn't check the class' * interfaces. */ public CellOrientatedTable(TableModel dm) { this(dm,false); } /** * Create a CellOrientatedTable which optionally checks the class' * interfaces. The class hierarchy is checked first, is no more specific * editor or renderer is found than one for Object, then the class' * implemented interfaces are tried. */ public CellOrientatedTable(TableModel dm, boolean tryInterfaces) { super(dm); this.tryInterfaces = tryInterfaces; } public TableCellEditor getCellEditor(int row, int column) { Class c = this.getValueAt(row,column).getClass(); if (c==null) return null; // Now try to find one which is more specific. First do what is // normally done and just search the class hierarchy. TableCellEditor editor = getDefaultEditor(c); // Now try to find one based on the implemented interfaces if this has // been requested and the class hierarchy didn't find a more specific // one. if (tryInterfaces && editor==getDefaultEditor(Object.class)) { Class[] interfaces = c.getInterfaces(); for (int i=0; i<interfaces.length; i++) { TableCellEditor newEditor = getDefaultEditor(interfaces[i]); if (newEditor!=null) { editor = newEditor; break; } } } return editor; } public TableCellRenderer getCellRenderer(int row, int column) { Class c = this.getValueAt(row,column).getClass(); if (c==null) return null; // Now try to find one which is more specific. First do what is // normally done and just search the class hierarchy. TableCellRenderer renderer = getDefaultRenderer(c); // Now try to find one based on the implemented interfaces if this has // been requested and the class hierarchy didn't find a more specific // one. if (tryInterfaces && renderer==getDefaultRenderer(Object.class)) { Class[] interfaces = c.getInterfaces(); for (int i=0; i<interfaces.length; i++) { TableCellRenderer newRenderer = getDefaultRenderer(interfaces[i]); if (newRenderer!=null) { renderer = newRenderer; break; } } } return renderer; } }