AbstractTableModel com TableCellRenderer?

9 respostas
fernandopaiva

Salve galera, estou tentando pintar as linhas de uma JTable conforme uma condicao verdadeira. No caso eu tenho as prioridades por exemplo “Prioridade Normal, Prioridade Urgente, Prioridade Urgentissimo”.
Se “Prioridade Urgente = S”, pinta linha de amarelo
SeNão Se “Prioridade Urgentissimo = S”, pinta linha de vermelho
Senão
"Prioridade Normal = S", deixa linha como esta

Estou tentando assim.

public class YRequisicoes {
    /** Tabela de Requisicoes yrequisicoes em MySQL */
    private Long id;
    private Long idControlReq;
    private String data;
    private Integer idDepto;
    private Long idFunc;    
    private String pn; //prioridade normal
    private String pu; //prioridade urgente
    private String pmo; //prioridade urgentissimo
    private String manut;    
    private String prev;
    private String cor;
    private String mequip;
    private String repest;
    private String usoimed;
    private String observ;
    private String status;
//get e set




public class RequisicoesTableModel extends AbstractTableModel{
    /** AbstractTableModel de YRequisicoes */
    private List<YRequisicoes> lista;
    private String[] colunas = {"", "Id", "Data", "Pri.Normal", "Pri.Urgente", "Pri.Urgetmo", "Manutenção", "Preventivo", "Corretivo", "Mont.Equipto", "Repos.Estoque", "Uso Imedto."};
    
    
    public RequisicoesTableModel(){
        lista = new ArrayList<YRequisicoes>();
    }
    
    
    public RequisicoesTableModel(List<YRequisicoes> lista){
        this();
        this.lista.addAll(lista);
    }
    

    @Override
    public int getRowCount() {
        return lista.size();
    }

    
    @Override
    public int getColumnCount() {
        return colunas.length;
    }
    
    
    public String getColumnName(int column) {
        if(colunas[column] == ""){
            return "";
        }else if(colunas[column] == "Id"){
            return "Id";
        }else if(colunas[column] == "Data"){
            return "Data";
        }else if(colunas[column] == "Pri.Normal"){
            return "Pri.Normal";
        }else if(colunas[column] == "Pri.Urgente"){
            return "Pri.Urgente";
        }else if(colunas[column] == "Pri.Urgetmo"){
            return "Pri.Urgetmo";
        }else if(colunas[column] == "Manutenção"){
            return "Manutenção";
        }else if(colunas[column] == "Preventivo"){
            return "Preventivo";
        }else if(colunas[column] == "Corretivo"){
            return "Corretivo";
        }else if(colunas[column] == "Mont.Equipto"){
            return "Mont.Equipto";
        }else if(colunas[column] == "Repos.Estoque"){
            return "Repos.Estoque";
        }else if(colunas[column] == "Uso Imedto."){
            return "Uso Imedto.";
        }
        return "";
    }
    
    
    public Class getColumnClass(int columnIndex) {
        if(colunas[columnIndex] == ""){
            return String.class;
        }else if(colunas[columnIndex] == "Id"){
            return long.class;
        }else if(colunas[columnIndex] == "Data"){
            return String.class;
        }else if(colunas[columnIndex] == "Pri.Normal"){
            return String.class;
        }else if(colunas[columnIndex] == "Pri.Urgente"){
            return String.class;
        }else if(colunas[columnIndex] == "Pri.Urgetmo"){
            return String.class;
        }else if(colunas[columnIndex] == "Manutenção"){
            return String.class;
        }else if(colunas[columnIndex] == "Preventivo"){
            return String.class;
        }else if(colunas[columnIndex] == "Corretivo"){
            return String.class;
        }else if(colunas[columnIndex] == "Mont.Equipto"){
            return String.class;
        }else if(colunas[columnIndex] == "Repos.Estoque"){
            return String.class;
        }else if(colunas[columnIndex] == "Uso Imedto."){
            return String.class;
        }
        return String.class;
    }
    

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        YRequisicoes r = lista.get(rowIndex);
        switch(columnIndex){
            case 0: return "";                
            case 1: return new FormataCodigos().retornaCodigoFormatado(r.getIdControlReq());                                
            case 2: return r.getData();                
            case 3: return r.getPn();
            case 4: return r.getPu();
            case 5: return r.getPmo();
            case 6: return r.getManut();
            case 7: return r.getPrev();
            case 8: return r.getCor();
            case 9: return r.getPrev();
            case 10: return r.getMequip();
            case 11: return r.getRepest();
            case 12: return r.getUsoimed();
                
            default: return new String();
        }
    }
    
    
    public YRequisicoes getRequisicoes(int row){
        return lista.get(row);
    }
    
    
    public List<YRequisicoes> getListaRequisicoes(){
        return lista;
    }
    
    
    public void alterList(List<YRequisicoes> lista){
        this.lista = lista;
        fireTableDataChanged();
    }    
}




/** Metodo do JDialog que define a JTable */
 private void getRequisicoes(){       
        List<YRequisicoes> lista = new YrequisicoesDAO().getAllRequisicoesByStatusR();
        RequisicoesTableModel requisicaoTableModel = new RequisicoesTableModel(lista);        
        tabelaRequisicoes.setModel(requisicaoTableModel); 
        tabelaRequisicoes.setDefaultRenderer(YRequisicoes.class, new RequisicoesTableCellRenderer());        
    }





public class RequisicoesTableCellRenderer extends DefaultTableCellRenderer{
/** TableCellRenderer  de Requisicoes */
    
    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int col){
         JLabel label = (JLabel)super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, col);
         YRequisicoes r = ((RequisicoesTableModel)table.getModel()).getRequisicoes(row);
         if(r.getPu().equals("S")){
             label.setForeground(Color.WHITE);
             label.setBackground(Color.YELLOW);
         }else if(r.getPmo().equals("S")){
             label.setForeground(Color.WHITE);
             label.setBackground(Color.RED);
         }else{
             label.setForeground(Color.BLACK);
             label.setBackground(Color.WHITE);
         }         
         
         if(isSelected){
             label.setForeground(Color.WHITE);
             label.setBackground(Color.BLUE);
         }else{
             label.setForeground(Color.BLACK);             
         }
         return label;
    }
}

Não estou conseguindo fazer isto funcionar, não tenho erro nenhum, apenas não pinta as linhas conforme preciso no bloco condicional.

Como resolver isso ?

obrigado.

9 Respostas

E

Calhou de

}else if(colunas[columnIndex] == "Mont.Equipto"){

funcionar - normalmente tal tipo de código não funciona em Java :slight_smile:

ViniGodoy

Por que você não implementa o getColumnName assim?

public String getColumnName(int column) { return column &lt; columns.length ? columns[column] : &quot;&quot;; }

No caso do getColumnClass, só o id não é String, pq vc não implementa assim?

public Class&lt;?&gt; getColumnClass(int columnIndex) { return colunas[columnIndex].equals(&quot;Id&quot;) ? long.class : String.class; }

Outra coisa, como você associou o seu CellRenderer a sua JTable?

fernandopaiva

ViniGodoy:
Por que você não implementa o getColumnName assim?

public String getColumnName(int column) { return column &lt; columns.length ? columns[column] : &quot;&quot;; }

No caso do getColumnClass, só o id não é String, pq vc não implementa assim?

public Class&lt;?&gt; getColumnClass(int columnIndex) { return colunas[columnIndex].equals(&quot;Id&quot;) ? long.class : String.class; }

Outra coisa, como você associou o seu CellRenderer a sua JTable?

Oi Vini, estou tentando associar assim.

private void getRequisicoes(){         
        List&lt;YRequisicoes&gt; lista = new YrequisicoesDAO().getAllRequisicoesByStatusR();
        requisicaoTableModel = new RequisicoesTableModel(lista);        
        tabelaRequisicoes.setModel(requisicaoTableModel); 
        tabelaRequisicoes.setDefaultRenderer(Object.class, new RequisicoesTableCellRenderer());        
    }

obrigado

ViniGodoy

Você está dizendo que a coluna que retornar “Object.class” no tipo, terá que usar seu Renderer.

Entretanto, nenhuma das suas colunas retorna Object.class no getColumnType.

fernandopaiva

ViniGodoy:
Você está dizendo que a coluna que retornar “Object.class” no tipo, terá que usar seu Renderer.

Entretanto, nenhuma das suas colunas retorna Object.class no getColumnType.

Sim, mas tentei tbm fazer com o meu POJO e msm assim ainda não consegui

veja.

List&lt;YRequisicoes&gt; lista = new YrequisicoesDAO().getAllRequisicoesByStatusR();
        requisicaoTableModel = new RequisicoesTableModel(lista);        
        tabelaRequisicoes.setModel(requisicaoTableModel); 
        tabelaRequisicoes.setDefaultRenderer(YRequisicoes.class, new RequisicoesTableCellRenderer());

Alguma dica ?

obrigado

ViniGodoy

Mas em que coluna você está retornando YRequisicoes.class? Eu só vi você retornar String.class e long.class.

O table funciona assim:

  1. Ele vai desenhar uma célula;
  2. Ele chama o método getColumnClass do model para descobrir o tipo da célcula;
  3. Ele consulta o mapa dos renderers para ver se tem algum daquele tipo. Se tiver usa. Se não tiver, usa do Object.class;
  4. Ele pergunta o valor da célula no getValueAt do seu model.
  5. Ele renderiza o valor usando o renderer retornado.
fernandopaiva

ViniGodoy:
Mas em que coluna você está retornando YRequisicoes.class? Eu só vi você retornar String.class e long.class.

O table funciona assim:

  1. Ele vai desenhar uma célula;
  2. Ele chama o método getColumnClass do model para descobrir o tipo da célcula;
  3. Ele consulta o mapa dos renderers para ver se tem algum daquele tipo. Se tiver usa. Se não tiver, usa do Object.class;
  4. Ele pergunta o valor da célula no getValueAt do seu model.
  5. Ele renderiza o valor usando o renderer retornado.

Opa Vini, entendi a teoria, mas na prática ta meio osso de implementar o que preciso.
Basicamente eu preciso ver se um determinado valor é “S” ou “N”, caso seja “S” pinta a linha de uma cor e caso seja “N” pinta a linha de outra cor.

veja

public class RequisicoesTableCellRenderer extends DefaultTableCellRenderer{    
    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int col){
         JLabel label = (JLabel)super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, col);

         // Referencia o POJO
         YRequisicoes r = ((RequisicoesTableModel)table.getModel()).getRequisicoes(row);         
         
         /** Aqui esta o problema - Preciso verificar os valores S para linhas */
         if(r.getPu().equals("S")){ 
             label.setForeground(Color.WHITE);
             label.setBackground(Color.YELLOW);
         }else if(r.getPmo().equals("S")){
             label.setForeground(Color.WHITE);
             label.setBackground(Color.RED);
         }else{
             label.setForeground(Color.BLACK);
             label.setBackground(Color.WHITE);
         }         
         
         
         if(isSelected){
             label.setForeground(Color.WHITE);
             label.setBackground(Color.BLUE);
         }else{
             label.setForeground(Color.BLACK);             
         }
         return label;
    }
}

Como consigo fazer isso ?

obrigado

ViniGodoy

Tente corrigir seu getColumnClass para:

public Class&lt;?&gt; getColumnClass(int columnIndex) { return YRequisicoes.class; }

Estou assumindo que você fez a associação do Renderer assim:

fernandopaiva

[quote=ViniGodoy]Tente corrigir seu getColumnClass para:

public Class&lt;?&gt; getColumnClass(int columnIndex) { return YRequisicoes.class; }

Estou assumindo que você fez a associação do Renderer assim:

Opa grande Vini, funcionou em partes…Agora somente pinta a linha caso eu clique sobre ela, entende ?
Tipo, eu pinto de Amarelo ou Vermelho, mas somente aparece a cor quando clico sobre a linha referente.

fiz assim

// DefaultTableCellRenderer
public class RequisicoesTableCellRenderer extends DefaultTableCellRenderer{      
    @Override  
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int col){  
         JLabel label = (JLabel)super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, col);    
         YRequisicoes r = ((RequisicoesTableModel)table.getModel()).getRequisicoes(row);
         
         if(r.getPu().equals("S")){   
             label.setForeground(Color.BLACK);
             label.setBackground(new Color(240, 230, 140));//yellow
         }else if(r.getPmo().equals("S")){  
             label.setForeground(Color.BLACK);  
             label.setBackground(new Color(205,92,92));  //red
         }else{  
             label.setForeground(Color.WHITE);  
             label.setBackground(Color.BLUE);  
         }
         return label;  
    }  
}  


// AbstractTableModel 
    public Class&lt;?&gt; getColumnClass(int columnIndex) {        
        return YRequisicoes.class;  
    }      



// Referencia 
private void getRequisicoes(){ 
        List&lt;YRequisicoes&gt; lista = new YrequisicoesDAO().getAllRequisicoesByStatusR();
        requisicaoTableModel = new RequisicoesTableModel(lista);        
        tabelaRequisicoes.setModel(requisicaoTableModel); 
        tabelaRequisicoes.setDefaultRenderer(YRequisicoes.class, new RequisicoesTableCellRenderer());        
    }

obrigado pela atenção.

[]s

Criado 5 de abril de 2012
Ultima resposta 9 de abr. de 2012
Respostas 9
Participantes 3