protected Comparator getComparator(int column) {
   Class columnType = tableModel.getColumnClass(column);
   Comparator comparator = (Comparator) columnComparators.get(columnType);
   if (comparator != null) {
     return comparator;
   }
   if (Comparable.class.isAssignableFrom(columnType)) {
     return COMPARABLE_COMAPRATOR;
   }
   return LEXICAL_COMPARATOR;
 }
  private Row[] getViewToModel() {
    if (viewToModel == null) {
      int tableModelRowCount = tableModel.getRowCount();
      viewToModel = new Row[tableModelRowCount];
      for (int row = 0; row < tableModelRowCount; row++) {
        viewToModel[row] = new Row(row);
      }

      if (isSorting()) {
        Arrays.sort(viewToModel);
      }
    }
    return viewToModel;
  }
 public void setValueAt(Object aValue, int row, int column) {
   tableModel.setValueAt(aValue, modelIndex(row), column);
 }
 public Object getValueAt(int row, int column) {
   return tableModel.getValueAt(modelIndex(row), column);
 }
 public boolean isCellEditable(int row, int column) {
   return tableModel.isCellEditable(modelIndex(row), column);
 }
 public Class getColumnClass(int column) {
   return tableModel.getColumnClass(column);
 }
 public String getColumnName(int column) {
   return tableModel.getColumnName(column);
 }
 public int getColumnCount() {
   return (tableModel == null) ? 0 : tableModel.getColumnCount();
 }
 public int getRowCount() {
   return (tableModel == null) ? 0 : tableModel.getRowCount();
 }