Kolorowanie wierszy z zawijaniem tekstu, problme

0

Render tabelki:

class EvenOddRenderer implements TableCellRenderer
 {
  public final DefaultTableCellRenderer DEFAULT_RENDERER = new DefaultTableCellRenderer();
  Color zielony = new Color(137, 193, 123, 72);//red,green
  Color zielony2 = new Color(20, 100, 253, 72);//red,green
  public Component getTableCellRendererComponent(JTable table, Object value,
      boolean isSelected, boolean hasFocus, int row, int column) {
    Component renderer = DEFAULT_RENDERER.getTableCellRendererComponent(
        table, value, isSelected, hasFocus, row, column);
    ((JLabel) renderer).setOpaque(true);
    Color foreground, background;
    if (isSelected) {
      foreground = Color.black;
      background = zielony2;
    } else {
      if (row % 2 == 0) {
        foreground = Color.black;
        background = Color.white;
      } else {
        foreground = Color.black;
        background = zielony;
      }
    }
    renderer.setForeground(foreground);
    renderer.setBackground(background);
    return renderer;
  }
}

Jak widać koloruje co2gi weirsz w tablei, problem pojawił sie gdy musiałem zawijać wiersze w 2 ostatnich korkach w ten sposób:

public class TextAreaRenderer 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() {
    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());

    // 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) {
        TextAreaRenderer tar = (TextAreaRenderer) 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();
      }
    };
  }
}

No i wywołanie, tu przykladowo tworze tabelke:

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

No i zawijam wiesze w kolumnie 8

//---------------------------render zawijania werszy --------------------------
    TableColumnModel cmodel = table.getColumnModel();
    TextAreaRenderer textAreaRenderer = new TextAreaRenderer();
    cmodel.getColumn(8).setCellRenderer(textAreaRenderer);   
    TextAreaEditor textEditor = new TextAreaEditor();
    cmodel.getColumn(8).setCellEditor(textEditor);

Uruchamiam render kolorujacy co 2gi wiersz czyli wczesniej wklejony EvenOddRenderer

//---------------------------- render kolorow ----------------------------------

    Render_rozliczen();   

No i wczym problem, wszystko ładnie sie koloruje i zawija tylko komórki a właściwei kkolumny (czyli kolumne 8) mam nie pokolorowana. Nie koloruje kolumn w ktorych uzywam zawijania tekstu. No niby logiczne wszystko, ale nie wiem jak sobie z tym poradzic. Może coś podpowiecie Dzięki

0

o tak:

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());

    //--------------------------------------------------------------------------
    Color zielony = new Color(137, 193, 123, 72);//red,green
    if (row % 2 == 0){setBackground(Color.white);}else{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;
  }

1 użytkowników online, w tym zalogowanych: 0, gości: 1