Colorir Linha JTable

Tenho um AbstractTableModel e gostaria de alterar linhas especificas de acordo com o resultado de minha consulta porem não sei como fazer o método de colorir a linha.

`public class TBControleServicos extends AbstractTableModel implements TableCellRenderer {

private static final long serialVersionUID = 1L;  
  
/** 
 * Essa lista armazenará os objetos do tipo {@link Cliente} atualmente 
 * exibidos na tablela. 
 */  
private List<SaidaServicosAUX> veiculos;  


public TBControleServicos(List<SaidaServicosAUX> saida) {  
    this();  
    veiculos.addAll(saida);  
}  
 

// ==============================================================  
// Construtores.  
// ==============================================================  

/** 
 * Constutor que simplesmente instancia o nosso {@link List} que usaremos 
 * para guardar os valores. 
 */  
public TBControleServicos() {  
    // no construtor, instanciamos o List  
    veiculos = new ArrayList<SaidaServicosAUX>();  
}  

/** 
 * Criamos um construtor de conveniência para já popular a lista. 
 *  
 * @param lista 
 *            a lista de clientes a ser adicionada. 
 */  


// ==============================================================  
// Métodos implementados.  
// ==============================================================  

@Override  
public Class<?> getColumnClass(int coluna) {  
    // todas as colunas representam uma String  
    return String.class;  
}  


public int getColumnCount() {  
    // esse método deve retornar o número de colunas. No caso, 3 (uma para o  
    // nome, uma para o sobrenome e uma para o apelido).  
    return 9;  
}

private String dataFormatada(Date data1){
	DateFormat formataData = new SimpleDateFormat("dd/MM/yyyy");
	// Calendar c = Calendar.getInstance(); 
//	 c.add(Calendar.MONTH,10); adiciona mes
	// c.add(Calendar.DAY_OF_WEEK,10);
	 String data = formataData.format( data1); 
	return data;
}

@Override  
public String getColumnName(int coluna) {  
    // vamos retornar o nome de cada coluna  
    switch (coluna) {  
    case 0:  
        return "Data Saida"; // o nome da primeira coluna  
    case 1:  
        return "Portador"; // o nome da segunda  
    case 2:  
        return "OS"; // e o da terceira  
    case 3:
    	return "Loja";
    case 4:
    	return "Lente";
    case 5:
    	return "Laboratorio";
    case 6:
    	return "Segue Lente";
    case 7:
    	return"Data Prometida Cliente";
    case 8:
    	return"Urgente";
   
    default:  
        return ""; // isso nunca deve ocorrer, pois temos só 3 colunas  
    }  
}  


public int getRowCount() {  
    // retorna o número de linhas, ou seja, a quantidade de entradas na  
    // nossa lista.  
    return veiculos.size();  
}  


public Object getValueAt(int linha, int coluna) {  
    // vai retornar o valor de determinada célula. A linha representa a  
    // posição do Estado na nossa lista e a coluna vai ser: 1 - Id, 2 -  
    // Estado e 3 - Sigla  
    // primeiro vamos pegar o Estado da linha  
    SaidaServicosAUX e = veiculos.get(linha);  
    // façamos um switch  
    switch (coluna) {  
    case 0:  
        return dataFormatada((Date)e.getDataSaida()); // retornamos o ID 
    case 1:  
        return e.getPortador(); // retornamos o Estado  
    case 2:  
        return e.getOrdemServico(); // e a Sigla  
        case 3:  
            return e.getLoja(); // e a Sigla  
        
   
    case 4:
    	
			return e.getLente();
		
    case 5:
    	return e.getLaboratorio();
    case 6:
    	return e.getSegueLente();
    case 7:
    	
	
			return dataFormatada((Date)e.getDataEntrega());
		
		
		
    case 8:
    	
			return e.isUrgente();
		
   
		
    default:  
        return null; // isso nunca deve ocorrer, pois temos só 3 colunas  
    }  
}  

@Override  
public boolean isCellEditable(int rowIndex, int columnIndex) {  
    // nesse caso, todas as células são editáveis  
    return false;  
}  

@Override  
public void setValueAt(Object valor, int linha, int coluna) {  
    // aqui devemos atualizar o valor de nossos Estado 
    // vemos em qual linha ele está  
    SaidaServicosAUX c = veiculos.get(linha);  
   
   
    // e vemos o que será atualizado  
    switch (coluna) {  
    case 0:  
    	
    	c.setDataSaida(java.sql.Date.valueOf(valor.toString()));// mudamos o id
        
        break;  
    case 1:  
    	c.setPortador(valor.toString());
    	 // mudamos o estado 
        break;  
    case 2:  
    	c.setOrdemServico(valor.toString());
    	 // e a sigla  
        break;  
    case 3:
    	c.setLoja( valor.toString());
    case 4:
    	c.setLente(valor.toString());
    case 5:
    	c.setLaboratorio(valor.toString());
    case 6:
       c.setSegueLente(valor.toString());
    case 7:
    	c.setDataEntrega(java.sql.Date.valueOf(valor.toString()));
    case 8:
    	c.setUrgente(Boolean.valueOf(valor.toString()));
    	
    }  
    // é importante notificar os listeners a cada alteração  
    fireTableDataChanged();  
}  

// ==============================================================  
// Até aqui seria o mínimo necessário para um TableModel funcional, mas  
// ainda não há métodos para adicionar, remover ou resgatar objetos. Vamos  
// criá-los.  
// ==============================================================  

/** 
 * Adiciona um novo {@link Cliente} e notifica os listeners que um novo 
 * registro foi adicionado. 
 */  
public void adiciona(SaidaServicosAUX e) {  
    veiculos.add(e);  
    // informamos os listeners que a linha (size - 1) foi adicionada  
    fireTableRowsInserted(veiculos.size() - 1, veiculos.size() - 1);  
}  

/** 
 * Similar ao {@link #adiciona(Cliente)}, porém para remover. Recebe o 
 * índice do cliente a ser removido. Se não souber o índice, use o método 
 * {@link #getIndice(Cliente)} antes. 
 */  
public void remove(int indice) {  
    veiculos.remove(indice);  
    fireTableRowsDeleted(indice, indice);  
}  

/** 
 * Retorna o índice de determinado cliente. 
 */  
public int getIndice(SaidaServicosAUX e) {  
    return veiculos.indexOf(e);  
}  

/** 
 * Adiciona todos os clientes na lista à este modelo. 
 */  
public void adicionaLista(List<SaidaServicosAUX> lista) {  
    int i = veiculos.size();  
    veiculos.addAll(lista);  
    fireTableRowsInserted(i, i + lista.size());  
    
}  

/** 
 * Esvazia a lista. 
 */  
public void limpaLista() {  
    int i = veiculos.size();  
    veiculos.clear();  
    fireTableRowsDeleted(0, i - 1);  
}  
public void ordenarPorNome() {
    //ordena pelo nome
    Collections.sort(veiculos, new Comparator<SaidaServicosAUX>() {

        public int compare(SaidaServicosAUX o1, SaidaServicosAUX o2) {
            return o1.getLaboratorio().compareTo(o2.getLaboratorio());
        }
    });

    //avisa que a tabela foi alterada
    fireTableDataChanged();
}


public Component getTableCellRendererComponent(JTable table, Object value,
		boolean isSelected, boolean hasFocus, int row, int column) {
	// TODO Auto-generated method stub
	return null;
}

}`

Você tem que criar um Renderer. Veja um exemplo:

import java.awt.Color;
import java.awt.Component;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;

public class TableRenderer extends DefaultTableCellRenderer {

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

        String estado = table.getModel().getValueAt(row, 3).toString();
        
        if(estado.equals(Principal.APTO)){
            //comp.setBackground(Color.GREEN);
            comp.setBackground(new Color(100, 200, 50));
        } else if(estado.equals(Principal.FINALIZADO)){
            //comp.setBackground(Color.RED);
            comp.setBackground(new Color(255, 91, 96));
        }else if(estado.equals(Principal.PROCESSANDO)){
            //comp.setBackground(Color.BLUE);
            comp.setBackground(new Color(109, 149, 254));
        } else if(estado.equals(Principal.PARADO)){
            comp.setBackground(new Color(170, 170, 170));
            //comp.setBackground(Color.GRAY);
        }
        
        return comp;
    }
}

Depois na sua tabela você faz assim:

jTable.setDefaultRenderer(Object.class, new TableRenderer());

Fiz esta implementação em meu Abstracttablemodel e funcionou.

Porem agora quero fazer o seguinte toda vez que o campo que é boolean estiver como true eu altere a cor dele quando o jtable for preenchido

public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) {
Component renderer = DEFAULT_RENDERER.getTableCellRendererComponent(
table, value, isSelected, hasFocus, row, column);
((JLabel)renderer).setOpaque(true);
Color foreground, background;

      if (row % 2 == 0) {
        foreground = Color.black;
        background = Color.white;
        
      } else {
        foreground = Color.white;
        background = Color.gray;
      }
    if(isSelected){
    	 foreground = Color.black;
        background = Color.yellow;
	}
    renderer.setForeground(foreground);
    renderer.setBackground(background);
    return renderer;
  
}

Não sei se entendi direito…

Esse campo boolean é uma coluna do seu JTable? Se você quiser mudar a cor dessa coluna pode usar este mesmo método, repare que ele tem o parâmetro column, você pode fazer seu tratamento usando ele.