[RESOLVIDO]Não consigo colorir linhas especificas de um JTable

Eae pessoal, estou com problema que esta bem difícil de eu resolver, tenho uma tabela onde aparecem os equipamentos locados, e eu quero pintar as linhas da tabela de acordo com o status do equipamento, por exemplo: se o status do equipamento for locado a linha tem que ser azul, se estiver na manutenção a linha tem que ficar vermelha e assim por diante… Até achei alguns tópicos aqui no GUJ que até me deu uma ajudada mas nenhum solucionou o meu problema, só pra constar eu populo minha JTable com um Table Model e puxo os dados de uma base de dados.

Segue os códigos:

Table Model:

public class TableTelaPrincipal extends AbstractTableModel{
    
    BeansTelaPrincipal beanstp = new BeansTelaPrincipal();
    ConexaoBD conex = new ConexaoBD();
    private final List<BeansTelaPrincipal> dados = new ArrayList<>();
    private final String[] colunas = {"ID Locação","Equipamento","Código","Num. de Série", "Status",
                                      "Fisioterapeuta", "Paciente", "Responsavel", "Data inicial",
                                      "Valor da Locação"};
    
    @Override
    public String getColumnName(int column) {
        return colunas[column];
    }
    
    @Override
    public int getRowCount() {
        return dados.size();
    }

    @Override
    public int getColumnCount() {
        return colunas.length;
    }
   
    public List<BeansTelaPrincipal> read(){
        
        conex.conectar();
        PreparedStatement stmt = null;             
        ResultSet rs = null;
       try {
           stmt = conex.con.prepareStatement(TelaPrincipal.Select); // Aqui eu puxo o comando SQL do botão que carrega a tabela
           rs = stmt.executeQuery();
           while (rs.next()){
               BeansTelaPrincipal beans = new BeansTelaPrincipal(); 
               beans.setCodlocacao(rs.getInt("l.codlocacao"));
               beans.setEquipamento(rs.getString("e.nome"));
               beans.setCodigo(rs.getString("e.codinterno"));
               beans.setNumserie(rs.getString("e.numeroserie"));
               beans.setStatus(rs.getString("l.statusequip"));
               beans.setFisio(rs.getString("l.fisio"));
               beans.setPaciente(rs.getString("p.nome"));
               beans.setResponsavel(rs.getString("p.nomeresponsavel"));
               beans.setDatainicial(rs.getString("l.datainicial"));
               beans.setValor(rs.getString("l.valorlocacao"));
               dados.add(beans);
               this.fireTableDataChanged();
           }
       } catch (SQLException ex) {
          JOptionPane.showMessageDialog(null, "Erro ao preencher Tabela.\n Erro:"+ex);
       }
           conex.desconetar();
       return null;
}
    
    public List<BeansTelaPrincipal> clear(){
    dados.clear();
    return null;
    }
       
    @Override
    public Object getValueAt(int linha, int coluna) {
        BeansTelaPrincipal tp = dados.get(linha);
        switch (coluna){
            case 0:
                return dados.get(linha).getCodlocacao();
            case 1:
                return dados.get(linha).getEquipamento();
            case 2:
                return dados.get(linha).getCodigo();
            case 3:
                return dados.get(linha).getNumserie();
            case 4:
                return dados.get(linha).getStatus();
            case 5:
                return dados.get(linha).getFisio(); 
            case 6:
                return dados.get(linha).getPaciente();
            case 7:
                return dados.get(linha).getResponsavel();
            case 8:
                return dados.get(linha).getDatainicial();  
            case 9:
                return dados.get(linha).getValor();    
        }
        dados.set(linha, tp);
        fireTableRowsUpdated(linha, linha);
    return null;
    }
    
    public BeansTelaPrincipal getBeansTelaPrincipal (int linha){
            return dados.get(linha);
    }
    
}

Botão que carrega a tabela:

public static String Select = null; 

private void btnCarregarActionPerformed(java.awt.event.ActionEvent evt) {
TabelaLocacao.removeAll();
    Select = ("select l.codlocacao, e.nome, e.codinterno, e.numeroserie, l.statusequip, l.fisio, p.nome,"
            + " p.nomeresponsavel, l.datainicial, l.valorlocacao"
            + " from locacao l "
            + "join equipamento e "
            + "on l.codequip = e.codequip"
            + " join paciente p "
            + "on l.codpaciente = p.codpaciente"
            + " where e.tipoequipamento = '"+slctTipoequip.getSelectedItem()+"' ");
           // + " order by '"+order+"' ASC ");    
tabletp.clear();
tabletp.read();
TabelaLocacao.setDefaultRenderer(String.class, new TableRenderer());  }

Table Cell Renderer que eu tentei implementar:
(Eu não entendo muito esse código eu fiz ele com base em um tópico aqui do GUJ)

public class TableRenderer extends DefaultTableCellRenderer {
        @Override
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
            BeansTelaPrincipal bt =((TableTelaPrincipal) table.getModel()).getBeansTelaPrincipal(row);
            JLabel c = (JLabel) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
            c.setOpaque(true);
            
            if(bt.getStatus().equals("Locado")){
                c.setBackground(Color.blue);
            } else if (bt.getStatus().equals("Aguardando retirada")){
                c.setBackground(Color.yellow);
            } else if (bt.getStatus().equals("Manutenção")){
                c.setBackground(Color.red);
            }
            
            return c;
    }
    }

Neste link há um exemplo de como implementar um TableCellRenderer.
É só adaptar o código para usar outras cores de acordo com o status do seu objeto.

1 curtida

Olá, faz um debug no seu código, coloque um System.out.print no seu TableRenderer em cada if pra ver se está passando por eles, aparentemente seu código está ok, veja somente essa linha:

TabelaLocacao.setDefaultRenderer(String.class, new TableRenderer()); 

troque por:

TabelaLocacao.setDefaultRenderer(Object.class, new TableRenderer());
1 curtida

Era isso mesmo mano, eu mudei para:

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

e consegui resolver, VALEW!!!

valew staroski

1 curtida