Prośba o pomoc z Renderem JTable.

0

Witajcie,

      Mam problem z działaniem rendera tabelki po zmianie jej modelu. Używam Rendera tabeli który: oblicza wysokość wiersza tak aby tekst w komórkach był zawinięty a wysokość wiersza dostosowan do potrzeb oraz koloruje wiersze. Wszystko działało dobrze gdy model tabeli opierał się na String, jednak gdy użyje innego modelu z kolumnami typu Boolean Render wyświetla w tych kolumnach zamiast CheckBox wartość true bąd false. Oczywiście mogę pominąć używanie render dla kolumn typu Boolean jednak mam wtedy komórkę w innym kolorze niż cały wiersz. No i robi się bałagan wolałbym mieć tak zrobiony Render który wyświetli mi CheckBox i jednocześnie pokoloruje komórkę. Sam model działa poprawnie (wyświetla CheckBox), dopiero po uruchominiu rendera (koloruje wiersze, zawija tekst w komórkach) nie wyświetlają się CheckBox.

Oto model tabelki:

jTable.setModel(new javax.swing.table.DefaultTableModel(data,head) 
            {
             Class[] types = new Class [] 
                {
                 java.lang.Integer.class, 
                 java.lang.String.class,
                 java.lang.String.class,
                 java.lang.String.class,
                 java.lang.Boolean.class,
                 java.lang.Boolean.class,
                 java.lang.Boolean.class,
                 java.lang.Boolean.class,
                 java.lang.Integer.class,
                 java.lang.Integer.class,
                 java.lang.String.class,
                 java.lang.String.class,                
                };
            public Class getColumnClass(int columnIndex) {return types [columnIndex];}
            });

I mój Render:

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());
    //--------------------------------------------------------------------------
    Color niebieski2 = new Color(20, 100, 253, 90);
    Color niebieski = new Color(20, 100, 253, 35);
    
    if (isSelected) {setBackground(niebieski2);}
    else{if (row % 2 == 0){setBackground(Color.white);}else{setBackground(niebieski);}}
    //--------------------------------------------------------------------------
    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;
  }
}

Jak i jego wywołanie:

public class Render 
{
 public static void Render(javax.swing.JTable table)
 {
  
 TableColumnModel cmodel = table.getColumnModel();
 TextAreaRenderer textAreaRenderer = new TextAreaRenderer();
 for (int i=0; i<table.getColumnCount();i++)
     {cmodel.getColumn(i).setCellRenderer(textAreaRenderer);}
 }
 } 
0

Używaj dwóch różnych rendererów, ten dla kolumn typu Boolean będzie tylko zmieniał kolor tła.

0

Tak też zrobiłem :

public class TextAreaRendererColor extends JTextArea implements TableCellRenderer {
private final DefaultTableCellRenderer adaptee = new DefaultTableCellRenderer();

public Component getTableCellRendererComponent(JTable table, Object obj, boolean isSelected,boolean hasFocus, int row, int column)       
  {
    adaptee.getTableCellRendererComponent(table, obj,isSelected, hasFocus, row, column);
    setForeground(adaptee.getForeground());
    setBackground(adaptee.getBackground());  
    setText(adaptee.getText());
    //--------------------------------------------------------------------------
    Color miebieski2 = new Color(20, 100, 253, 90);//red,green
    Color niebieski = new Color(20, 100, 253, 35);//red,green
    
    if (isSelected) {setBackground(miebieski2);}
     else{if (row % 2 == 0){setBackground(Color.white);}else{setBackground(niebieski);}}

    return this;
  }
}

Kolory wierszy są już ok, jednak nadal w komórkach typu Boolean mam tekst zamist CheckBox. Odpowiedzialna jest za to ta komenda:

setText(adaptee.getText());

Można to jakoś mzienić abym w efekcie widział CheckBox?

2
class AnotherCellRenderer implements TableCellRenderer
{
    public Component getTableCellRendererComponent(JTable t,Object value,boolean selected,boolean hasFocus,int row,int col)
    {
        JCheckBox header = new JCheckBox("",(Boolean)value);
        header.setOpaque(true);
        header.setBackground(....);
        return header;
    }
}
0

Super, dzięki wielkie za pomoc. Troche się z tym męczyłem widać wiedza jeszcze za mała.

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