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…