CellRenderer

Olá…
Qual seria a maneira correta de implementar um CellRenderer sendo q preciso pintar a linha se o valor da segunda coluna for "Debito"
obs.: preciso pintar a linha inteira e não somente uma célula…

pra pintar a célula:

public Component getTableCellRendererComponent( JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column){ if (value.toString().equals("Debito")) { this.setBackground(Color.red); this.setForeground(Color.black); }else { this.setBackground(defaultBG); this.setForeground(defaultFG); } this.setText(value.toString()); return this; }
assim só a célula correspondente ao valor é pintada, mas preciso pintar a linha inteira que contém este valor
desde já obrigado…

Para pintar a linha inteira, em princípio vejo duas saídas possíveis:

  • Redefina os CellRenderer’s de TODAS as colunas para que usem sua lógica especializada de pintura, ou;

  • Redefina o método JTable.prepareRenderer(), pelo qual passam todos os CellRenderer’s, para que use sua lógica especializada de pintura.

http://java.sun.com/javase/6/docs/api/javax/swing/JTable.html#prepareRenderer(javax.swing.table.TableCellRenderer, int, int)

eu consigo pintar a linha inteira, mas não a partir deste teste do débito…
eu posso implementar um CellRenderer criando um metodo onde eu passo a linha desejada e pintá-la, mas creio q assim não seja uma forma muito eficiente…

ex:

[code]public class PintarLinhasTabela extends DefaultTableCellRenderer {

private Map cores = new HashMap();   

private Point tempCel = new Point(0, 0);   

private Color defaultBG;   

public PintarLinhasTabela() {   
	this.defaultBG = getBackground(); 

}   

public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,   
		boolean hasFocus, int row, int column) {   

	Component c = super.getTableCellRendererComponent(   
			table,   
			value,   
			isSelected,   
			hasFocus,   
			row,   
			column);   

	this.tempCel.x = row;   
	this.tempCel.y = column; 
	if (isSelected) {
		//c.setBackground(Color.cyan);
	}else {
		if (this.cores.containsKey(this.tempCel)) {   
			c.setBackground((Color) this.cores.get(this.tempCel));   
		} else {   
			c.setBackground(this.defaultBG);   
		}   
	}
	return c;   
}    

public void colorirCelula(int row, Color cor, JTable table) {
	table.setDefaultRenderer(Object.class, this);
	for (int i=0; i<=table.getColumnCount()-1; i++) {
		this.cores.put(new Point(row, i), cor);
	}
	table.updateUI();
}

[/code]
e o método colorirCelula seria chamado externamente para pintar uma linha somente (aí eu faço o teste do debito)…
só q desta forma o CellRenderer passaria por todas as linhas pra pintar somente uma, o q não é nada bom…

eu passaria diretamente um objeto no método getValueAt dai no renderer seria só verificar,
e caso o objeto fosse grande demais eu criaria um menor para utilizar ali e/ou em outras tabelas tambem…

mas o método getTableCellRendererComponent já tem o objeto que retorna de getValueAt… é o parametro ‘Object value’ da assinatura…
desculpa se não entendi sua colocação…

o ideal ainda seria fazer o CellRenderer passar uma vez para cada linha e não uma vez para cada célula…