[RESOLVIDO]Foreground na ultima linha da JTable

Pessoal to tentando dar um foreground “colorir” o conteudo da ultima linha da jTable até consigo, porem quando eu mecho na barra de rolagem ele pinta as outras ou quando eu clico ele tb pinta as outras, tem como me ajudar?

[code]package com.mascarenhas.model.tables;

import java.awt.Color;
import java.awt.Component;

import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;

import com.mascarenhas.view.JDialogOutrosValores;

public class MyCellRendererOutrosValores extends DefaultTableCellRenderer {

/**
 * 
 */
private static final long serialVersionUID = 1L;

private Color cor1;
private Color cor2;

int ultimaLinha = 0;

public MyCellRendererOutrosValores(Color cor1, Color cor2){
	
	this.cor1 = cor1;
	this.cor2 = cor2;
	
	ultimaLinha = JDialogOutrosValores.jTable.getRowCount()-1;
}


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

	Component comp = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); // tentei tirar o isSelected mas o construtor nao deixa entao não sei se tem outra forma de fazer.
	
	if(row % 2 == 0){
		
		comp.setBackground(cor1);  
							
	}else{
		
		comp.setBackground(cor2);  
					
	}
	
	if(row == ultimaLinha){
		comp.setForeground(Color.RED);
	}
	
	return comp;
	
}

}
[/code]

É pq vc modificou a cor do componente, e ele é o mesmo usado para as outras linhas. Você deve voltar a cor original, caso a linha não seja a última:

[code]package com.mascarenhas.model.tables;

import java.awt.Color;
import java.awt.Component;

import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;

public class MyCellRendererOutrosValores extends DefaultTableCellRenderer {
private static final long serialVersionUID = 1L;

private Color cor1;
private Color cor2;

public MyCellRendererOutrosValores(Color cor1, Color cor2){
    this.cor1 = cor1;
    this.cor2 = cor2;
}
	
@Override
public Component getTableCellRendererComponent(JTable table, Object value,
        boolean isSelected, boolean hasFocus, int row, int column) {

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

    comp.setBackground(row % 2 == 0 ? cor1 : cor2);  
    comp.setForeground(row == table.getRowCount() -1 ? Color.RED : Color.BLACK);
	
    return comp;		
}

}[/code]

Note que não é necessário passar o seu dialog como parâmetro, já que o renderer recebe como parâmetro a tabela sobre qual atua.

[quote=ViniGodoy]É pq vc modificou a cor do componente, e ele é o mesmo usado para as outras linhas. Você deve voltar a cor original, caso a linha não seja a última:

[code]package com.mascarenhas.model.tables;

import java.awt.Color;
import java.awt.Component;

import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;

public class MyCellRendererOutrosValores extends DefaultTableCellRenderer {
private static final long serialVersionUID = 1L;

private Color cor1;
private Color cor2;

public MyCellRendererOutrosValores(Color cor1, Color cor2){
    this.cor1 = cor1;
    this.cor2 = cor2;
}
	
@Override
public Component getTableCellRendererComponent(JTable table, Object value,
        boolean isSelected, boolean hasFocus, int row, int column) {

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

    comp.setBackground(row % 2 == 0 ? cor1 : cor2);  
    comp.setForeground(row == table.getRowCount() -1 ? Color.RED : Color.BLACK);
	
    return comp;		
}

}[/code]

Note que não é necessário passar o seu dialog como parâmetro, já que o renderer recebe como parâmetro a tabela sobre qual atua.[/quote]

Vini muito obrigado mais uma vez, funcionou perfeitamente. À respeito do renderer receber o table atual entendi perfeitamente muito obrigado, agora quando ele chegar na ultima linha ele troca a cor pra vermelho pq eu devo voltar pra black sendo que acabou as linhas?

Sim. O que acontece é que você tem um único componente de renderer, que é usado para desenhar várias vezes.

Assim que ele pintar a última linha, esse componente vai ficar com foreground vermelho. O que acontece quando você movimentar o scroll JTable, ou minimizar e maximizar a tela?

Ele vai pedir para desenhar linhas que ficaram escondidas. Nesse caso, o seu componente ainda vai estar com foreground marcado em vermelho, e tudo que for repintado, será em vermelho.

Se você quiser que seu renderer “esqueça” o estado da pintura anterior, você pode é não implementar DefaultCellRenderer e então ao invés de fazer:

Component comp = super.getTableCellRenderer(...);

Você faz:

Component com = new JLabel();

Eu não recomendo muito isso, pois o DefaultCellRenderer tem um código mais otimizado que o de um JLabel padrão. Mas é sempre bom saber que essa opção existe. O contrato do cellrenderer deve apenas retornar um componente que será usado na pintura, ele não precisa necessariamente ser o mesmo.

Então, via de regra, você sempre deve fazer a pintura no DefaultCellRenderer para os dois casos. Quando a condição que você quer combina, e quando a condição que você quer não combina.

[quote=ViniGodoy]Sim. O que acontece é que você tem um único componente de renderer, que é usado para desenhar várias vezes.

Assim que ele pintar a última linha, esse componente vai ficar com foreground vermelho. O que acontece quando você movimentar o scroll JTable, ou minimizar e maximizar a tela?

Ele vai pedir para desenhar linhas que ficaram escondidas. Nesse caso, o seu componente ainda vai estar com foreground marcado em vermelho, e tudo que for repintado, será em vermelho.

Se você quiser que seu renderer “esqueça” o estado da pintura anterior, você pode é não implementar DefaultCellRenderer e então ao invés de fazer:

Component comp = super.getTableCellRenderer(...);

Você faz:

Component com = new JLabel();

Eu não recomendo muito isso, pois o DefaultCellRenderer tem um código mais otimizado que o de um JLabel padrão. Mas é sempre bom saber que essa opção existe. O contrato do cellrenderer deve apenas retornar um componente que será usado na pintura, ele não precisa necessariamente ser o mesmo.

Então, via de regra, você sempre deve fazer a pintura no DefaultCellRenderer para os dois casos. Quando a condição que você quer combina, e quando a condição que você quer não combina.[/quote]

Nossa Vini perfeito cara, agora ficou claro!!! Muito obrigado pelas respostas!!!

[quote=ViniGodoy]Sim. O que acontece é que você tem um único componente de renderer, que é usado para desenhar várias vezes.

Assim que ele pintar a última linha, esse componente vai ficar com foreground vermelho. O que acontece quando você movimentar o scroll JTable, ou minimizar e maximizar a tela?

Ele vai pedir para desenhar linhas que ficaram escondidas. Nesse caso, o seu componente ainda vai estar com foreground marcado em vermelho, e tudo que for repintado, será em vermelho.

Se você quiser que seu renderer “esqueça” o estado da pintura anterior, você pode é não implementar DefaultCellRenderer e então ao invés de fazer:

Component comp = super.getTableCellRenderer(...);

Você faz:

Component com = new JLabel();

Eu não recomendo muito isso, pois o DefaultCellRenderer tem um código mais otimizado que o de um JLabel padrão. Mas é sempre bom saber que essa opção existe. O contrato do cellrenderer deve apenas retornar um componente que será usado na pintura, ele não precisa necessariamente ser o mesmo.

Então, via de regra, você sempre deve fazer a pintura no DefaultCellRenderer para os dois casos. Quando a condição que você quer combina, e quando a condição que você quer não combina.[/quote]

Bom dia ViniGodoy wrote, tem como vc me da uma forcinha com a implementação da class cellrenderer, eu abrir um tópico aqui no fórum esta logo abaixo o link depois tive com vc da uma olhadinha eu agradeço deste já um forte abraço a gelara do fórum.