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