CellRenderer

5 respostas
erico_kl

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…

5 Respostas

R

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)

erico_kl

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:
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();
	}
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..
M

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…

erico_kl

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…

erico_kl

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

Criado 25 de setembro de 2009
Ultima resposta 25 de set. de 2009
Respostas 5
Participantes 3