quarta-feira, 27 de junho de 2012

Colorir linhas de um JTable de acordo com a seleção de um checkbox de uma linha

Olá, pesquisando na web, achei várias tentativas de colorir uma ou mais linhas de um JTable, mas não tão flexíveis como o que venho apresentar nesse POST.
Uma opção também é usar o Tema Nimbus que já aplica isso nas tabelas.

Eu uso essa classe em meus projetos p/ alternar a cor das linhas de uma tabela, facilitando a visualização do usuário na grade de Dados.

Exemplo :
tabela carregada sem itens selecionados
e ao clicar no checkbox da coluna ATIVO, a linha tem sua cor e fonte alterado, destacando o item selecionado, porém observação: quando seleciona a opção ativo, a linha continua como no exemplo abaixo na linha 5 pois está usando o renderer padrão da tabela.

tabela com os itens selecionados
veja em funcionamento :
http://mario.portari.com.br/~surfer/blog/colorir_jtable.swf

Classe ColorRender que extende a classe DefaultTableCellRenderer
/*
 * Colorindo jTable.java 
 * Pintas as tabelas alterando as linhas
 * Destaca uma linha se o checkbox da linha for selecionado
 * Author : Mario Cezzare Angelicola Chiodi
 * mcezzare@gmail.com
 */
package lib;

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


public class ColorRender extends DefaultTableCellRenderer {

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

        super.getTableCellRendererComponent(table, value, isSelected,
                hasFocus, row, column);
        
        // seta o resultado p/ falso porque isso sera usado em varias Jtables do sistema
        boolean result = false;
        try{
// no nosso exemplo 

if (table.getName() != null) { // p/ não escrever um null cada vez que carregar uma célula
                if (table.getName().equals("jTable1")) {
                    result = (Boolean) table.getModel().getValueAt(row, 3);
                }
                if (table.getName().equals("titulosAutorizacao")) {
                    result = (Boolean) table.getModel().getValueAt(row, 6);
                }
            }
        }
        catch (java.lang.NullPointerException ex){
            System.out.println(ex.getMessage());
        }
        
        //se for uma linha selecionada
        if (isSelected) {
            setBackground(table.getSelectionBackground());
            setForeground(table.getSelectionForeground());
        } else {
            // se o checkbox estiver selecionado
            // pinta a linha inteira
            if (result) {
                setBackground(Color.YELLOW);
                setForeground(Color.RED);
                setFont(new Font("Verdana",Font.BOLD,10));
            } else {

                // se não , colore alternado as linhas
                if (row % 2 == 0) {
                    setBackground(Color.LIGHT_GRAY);
                    setForeground(Color.black);
                } else {
                    setBackground(Color.WHITE);
                    setForeground(Color.black);
                }
            }
        }
        return this;
    }
}


Frame testTable

//Colorindo jTable.java 
//Author : Mario Cezzare Angelicola Chiodi
// mcezzare@gmail.com



package tests;

import javax.swing.table.DefaultTableModel;
import lib.ColorRender;


public class testTable extends javax.swing.JFrame {

    /**
     * Creates new form testTable
     */
    public testTable() {
        initComponents();
        carregaTabela();
    }
    public final DefaultTableModel modelo =new javax.swing.table.DefaultTableModel(
            new Object [][] {

            },
            new String [] {
                "ID", "NOME", "EMAIL", "ATIVO"
            }
        ) {
            Class[] types = new Class [] {
                java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.Boolean.class
            };
            boolean[] canEdit = new boolean [] {
                false, false, false, true
            };

            public Class getColumnClass(int columnIndex) {
                return types [columnIndex];
            }

            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
        }; 
  private void carregaTabela() {
        // apenas para dar carga na tabela
    String [] nomes={"AAA","BBB",
             "CCC","DDD",
             "EEE","FFF",
             "FFF","HHH"
         };
         for (int i=0;i<8;i++){
         Object[] row = new Object[4];
         row[0]=i;
         row[1]=nomes[i];
         row[2]=nomes[i].toLowerCase()+"@email.org";
         row[3]=false;
         modelo.addRow(row);        
         }
        jTable1.setModel(modelo); 
  // fim da carga 
   // a grande manha para funcionar, especifique um nome p/ a JTable
        jTable1.setName("jTable1");
 // aplica o ColorRender na tabela
        jTable1.setDefaultRenderer(Object.class, new ColorRender());
   
 
        jLbTotal.setText(jTable1.getRowCount()+"");
     }
     

    private void initComponents() {

        jScrollPane1 = new javax.swing.JScrollPane();
        jTable1 = new javax.swing.JTable();
        jLabel1 = new javax.swing.JLabel();
        jLbTotal = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("Teste Colorir tabela");
      
        jScrollPane1.setViewportView(jTable1);

        jLabel1.setText("Total de Usuários:");

        jLbTotal.setText("0");
        jLbTotal.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));

        jLabel2.setFont(new java.awt.Font("Lucida Grande", 0, 10)); // NOI18N
        jLabel2.setForeground(new java.awt.Color(0, 0, 255));
        jLabel2.setText("exemplo de Mario Cezzare - mcezzare@gmail.com");

        org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(layout.createSequentialGroup()
                .addContainerGap()
                .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                    .add(layout.createSequentialGroup()
                        .add(jScrollPane1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)
                        .addContainerGap())
                    .add(layout.createSequentialGroup()
                        .add(jLabel1)
                        .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                        .add(jLbTotal)
                        .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, 23, Short.MAX_VALUE)
                        .add(jLabel2)
                        .add(14, 14, 14))))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(layout.createSequentialGroup()
                .addContainerGap()
                .add(jScrollPane1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 222, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                    .add(jLabel1)
                    .add(jLbTotal)
                    .add(jLabel2))
                .addContainerGap(org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        pack();
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        
        // Set the Nimbus look and feel
         
        
        
         //* If Nimbus (introduced in Java SE 6) is not available, stay with the
         //* default look and feel. For details see
         //* http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
         //
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(testTable.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(testTable.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(testTable.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(testTable.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }


        /*
         * Create and display the form
         */
        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
                new testTable().setVisible(true);
            }
        });
    }
    // Variables declaration - do not modify
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLbTotal;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTable jTable1;
    // End of variables declaration
}

------------------------------------------------------------





Nenhum comentário: