Kod:

public class TextAreaRenderer_nod extends JTextArea
    implements TableCellRenderer {
  private final DefaultTableCellRenderer adaptee =
      new DefaultTableCellRenderer();
  /** mapuj z tablicy do mapy wierszy do mapy wysokości kolumn*/
 
  private final Map cellSizes = new HashMap();

  public TextAreaRenderer_nod() {
    setLineWrap(true);
    setWrapStyleWord(true);    
  }

  public Component getTableCellRendererComponent(
      JTable table, Object obj, boolean isSelected,boolean hasFocus, int row, int column)
  {
    //ustaw kolory, etc. używając standardowych dla danej platformy
    adaptee.getTableCellRendererComponent(table, obj,isSelected, hasFocus, row, column);
    setForeground(adaptee.getForeground());
    setBackground(adaptee.getBackground());
    setBorder(adaptee.getBorder());
    setFont(adaptee.getFont());
    setText(adaptee.getText());
    //--------------------------------------------------------------------------
    String sciezka_bazy="bazy/";
    final String fileName_nody = sciezka_bazy+"nod.txt";
    ArrayList <Nod> nody = new ArrayList<Nod>();
    nody = new ArrayList<Nod>(EmployeeListDecorator_nod.readList(fileName_nody));
    //--------------------------------------------------------------------------
    Color zielony = new Color(137, 193, 123, 152);//red,green
    Color zielony2 = new Color(20, 100, 253, 72);//red,green
    Color czerwony = new Color(255, 64, 64, 52);//red,green
    Color pomaranczowy = new Color(255, 165, 0, 52);//red,green

    if (isSelected)
      {
       setForeground(Color.black);
       setBackground(zielony2);
      }
    else
      {     //-Pobieranie daty do konca waznosci nod
            SimpleDateFormat  formatdaty = new SimpleDateFormat("yyyy-MM-dd");
            Date pomoc = null;
            Date pomoc2 = null;
                try {
                     pomoc = (Date) formatdaty.parse((nody.get(row)._data_do_zlecenia));
                    } catch (ParseException ex) {Logger.getLogger(Okno_nod.class.getName()).log(Level.SEVERE, null, ex);}
                try {
                     pomoc2 = (Date) formatdaty.parse((nody.get(row)._data_do_zlecenia));
                    } catch (ParseException ex) {Logger.getLogger(Okno_nod.class.getName()).log(Level.SEVERE, null, ex); }
            //Odjecnie miesiaca od aktualna
            Calendar plus_miesiac = Calendar.getInstance();
            Calendar koncowa = Calendar.getInstance();
            plus_miesiac.setTime(pomoc);
            koncowa.setTime(pomoc2);
            plus_miesiac.add(Calendar.MONTH, -1);
            //- Pobieranie aktualnej
            Calendar aktualna = Calendar.getInstance();
            //Porównywanei calendarow
            if((aktualna.after(koncowa)))
              {
               setForeground(Color.black);setBackground(czerwony);
              }
            if((aktualna.before(koncowa))&&(aktualna.after(plus_miesiac)))
               {
               setForeground(Color.black);setBackground(pomaranczowy);
               }
            if(aktualna.before(plus_miesiac))
               {
               if (row % 2 == 0){setForeground(Color.black);setBackground(Color.white);}
               else {setForeground(Color.black);setBackground(zielony);}
               }    
    }
    //--------------------------------------------------------------------------
    // Ta linia była bardzo ważna, żeby działało z JDK1.4
    TableColumnModel columnModel = table.getColumnModel();
    setSize(columnModel.getColumn(column).getWidth(), 100000);
    int height_wanted = (int) getPreferredSize().getHeight();
    addSize(table, row, column, height_wanted);
    height_wanted = findTotalMaximumRowSize(table, row);
    if (height_wanted != table.getRowHeight(row)) {
      table.setRowHeight(row, height_wanted);
    }
    return this;
  }

  private void addSize(JTable table, int row, int column,int height)
  {
    Map rows = (Map) cellSizes.get(table);
    if (rows == null) {
      cellSizes.put(table, rows = new HashMap());
    }
    Map rowheights = (Map) rows.get(new Integer(row));
    if (rowheights == null) {
      rows.put(new Integer(row), rowheights = new HashMap());
    }
    rowheights.put(new Integer(column), new Integer(height));
  }

  /**
   * Przejrzyj wszystkie kolumny i pobierz procedurę rysującą.
   * Jeśli dodatkowo jest to  TextAreaRenderer, patrzymy też
   * na maksymalną wysokość w jego tablicy rozproszonej dla tego wiersza.
   */
  private int findTotalMaximumRowSize(JTable table, int row) {
    int maximum_height = 0;
    Enumeration columns = table.getColumnModel().getColumns();
    while (columns.hasMoreElements()) {
      TableColumn tc = (TableColumn) columns.nextElement();
      TableCellRenderer cellRenderer = tc.getCellRenderer();
      if (cellRenderer instanceof TextAreaRenderer_nod) {
        TextAreaRenderer_nod tar = (TextAreaRenderer_nod) cellRenderer;
        maximum_height = Math.max(maximum_height,
            tar.findMaximumRowSize(table, row));
      }
    }
    return maximum_height;
  }

  private int findMaximumRowSize(JTable table, int row) {
    Map rows = (Map) cellSizes.get(table);
    if (rows == null) return 0;
    Map rowheights = (Map) rows.get(new Integer(row));
    if (rowheights == null) return 0;
    int maximum_height = 0;
    for (Iterator it = rowheights.entrySet().iterator();
         it.hasNext();) {
      Map.Entry entry = (Map.Entry) it.next();
      int cellHeight = ((Integer) entry.getValue()).intValue();
      maximum_height = Math.max(maximum_height, cellHeight);
    }
    return maximum_height;
  }
}
public class TextAreaEditor extends DefaultCellEditor {
  public TextAreaEditor() {
    super(new JTextField());
    final JTextArea textArea = new JTextArea();
    textArea.setWrapStyleWord(true);
    textArea.setLineWrap(true);
    
    JScrollPane scrollPane = new JScrollPane(textArea);
    scrollPane.setBorder(null);
    editorComponent = scrollPane;

    delegate = new DefaultCellEditor.EditorDelegate() {
      public void setValue(Object value) {
        textArea.setText((value != null) ? value.toString() : "");
      }
      public Object getCellEditorValue() {
        return textArea.getText();
      }
    };
  }
}

Wywołanie:

TableColumnModel cmodel = table.getColumnModel();
  TextAreaRenderer_nod textAreaRenderer_nod = new TextAreaRenderer_nod();

  cmodel.getColumn(0).setCellRenderer(textAreaRenderer_nod);
  cmodel.getColumn(1).setCellRenderer(textAreaRenderer_nod);
  cmodel.getColumn(2).setCellRenderer(textAreaRenderer_nod);
  cmodel.getColumn(3).setCellRenderer(textAreaRenderer_nod);
  cmodel.getColumn(4).setCellRenderer(textAreaRenderer_nod);
  cmodel.getColumn(5).setCellRenderer(textAreaRenderer_nod);

Dla kazdej z kolumn wywolywane jest setCellRenderer(textAreaRenderer_nod) ktory okresla wysokosc wiersza dostosowujac go do najwyzszej komorki w wierszu. I to działa ok
Pomyslalem sobie ze wstaie jeszcze kolory tła. Ale chce miec 4 kolory. Domyslinei bialy i zielony dla wierszy na przemian. Pomaranczony jesli do daty brakuje miesiac. czerony gdy jest juz po terminie.
Warunki zrobilem dobrze bo niby to działa. Koloruje sie ładnie.

Problem mam gdy posortuje. wiersze sie sortuja (wraz z nimi szerokości kolumn) ale kolory zostaja na swoich miejscach.

Przykładow:

wiersz1: tekst a, szerokosc kolumny 5, kolor zielony
wiersz2: tekst b, szerokosc kolumny 10, kolor czerwony
wiersz3: tekst c, szerokosc kolumny 3, kolor pomaranczony
wiersz4: tekst d, szerokosc kolumny 2, kolor zielony

posortuje po tekscie Mam tak:

wiersz4: tekst d, szerokosc kolumny 2, kolor zielony
wiersz3: tekst c, szerokosc kolumny 3, kolor czerwony
wiersz2: tekst b, szerokosc kolumny 10, kolor pomarancowy
wiersz4: tekst d, szerokosc kolumny 2, kolor zielony

A powinno byc tak:

wiersz4: tekst d, szerokosc kolumny 2, kolor zielony
wiersz3: tekst c, szerokosc kolumny 3, kolor pomaranczony
wiersz2: tekst b, szerokosc kolumny 10, kolor czerwony
wiersz4: tekst d, szerokosc kolumny 2, kolor zielony

Co robię, źle? Masę czasu na to zmarniałem i dalej nic nie wymyslilem:/

ps.
Do sortowania uzyam:

final TableRowSorter<TableModel> sorter =new TableRowSorter<TableModel>(model);
table.setRowSorter(sorter);