Colorir linhas da Tabela ao iniciar a aplicação

7 respostas
R

Pesquisei pelo site, mas não achei gostaria de saber como colorir linhas em separados de um JTable exemplo as linhas pares serão azuis e as linhas impares serão vermelhas quero que acontece ao iniciar a aplicação, ou seja, já vem colorida por default segue o código que código que tenho até agora mas apenas pinta as linhas onde eu clicar com o mouse eu que pintar todas alternadamente

public Component getTableCellRendererComponent(  
	        JTable table,  
	        Object value,  
	        boolean isSelected,  
	        boolean hasFocus,  
	        int row,  
	        int column)  
	    {  
	        Component result = super.getTableCellRendererComponent(  
	            table,  
	            value,  
	            isSelected,  
	            hasFocus,  
	            row,  
	            column  
	        );  
	          
	        if(isSelected) {  
	            result.setFont(new Font("arial", Font.BOLD, 12));  
	            result.setForeground(Color.white);  
	            result.setBackground(Color.blue);  
	      
	        } else{
	        	 result.setFont(new Font("arial", Font.BOLD, 12));  
		            result.setForeground(Color.black);  
		            result.setBackground(Color.red); 
	        }
	        return result;  
	    }

7 Respostas

al.barbosa

Prezado,

Para ver se a linha é par ou ímpar, você pode usar o parâmetro row no getTableCellRendererComponent. Você pode testar se row % 2 == 0.
Fiz um teste com o código abaixo:

import javax.swing.*;
import java.awt.*;
import javax.swing.table.*;
import javax.swing.event.*;

public class Estudos extends JFrame{
  public Estudos(){
    super("Exemplo de uma tabela simples");
		
    // colunas da tabela
    String[] colunas = {"Cidade", "Estado", "Habitantes"};
		
    // conteúdo da tabela	
    Object[][] conteudo = {
        {"Goiânia", "GO", "43.023.432"},
        {"São Paulo", "SP", "5.343.234"},
        {"Rio de Janeiro", "RJ", "6.434.212"},
        {"Jussara", "GO", "87.454"},
        {"Barra do Garças", "MT", "64.344"}
    };
        
    // constrói a tabela
    final JTable tabela = new JTable(conteudo, colunas);
    tabela.setPreferredScrollableViewportSize(new Dimension(350, 100));
	
    Container c = getContentPane();
    c.setLayout(new FlowLayout());
	
    tabela.getColumn("Cidade").setCellRenderer(new HeaderJLabel());
    tabela.getColumn("Estado").setCellRenderer(new HeaderJLabel());
    tabela.getColumn("Habitantes").setCellRenderer(new HeaderJLabel());
			
    JScrollPane scrollPane = new JScrollPane(tabela);
    c.add(scrollPane);
    	
    setSize(400, 300);
    setVisible(true);
  }
	
  public static void main(String args[]){
    Estudos app = new Estudos();
    app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  }
}



class HeaderJLabel implements TableCellRenderer{
     public Component getTableCellRendererComponent(     
        JTable table,     
        Object value,     
        boolean isSelected,     
        boolean hasFocus,     
        int row,     
        int column)     
    {     
        Component result = table.getTableHeader().getDefaultRenderer().getTableCellRendererComponent(     
            table,     
            value,     
            isSelected,     
            hasFocus,     
            row,     
            column     
        );     
             
        if(row % 2 == 0) {     
            result.setFont(new Font("arial", Font.BOLD, 12));     
            result.setForeground(Color.white);     
            result.setBackground(Color.blue);     
         
        } else{   
             result.setFont(new Font("arial", Font.BOLD, 12));     
                result.setForeground(Color.black);     
                result.setBackground(Color.red);   
        }   
        return result;     
    }  
}
al.barbosa

rcarauta,

Segue o exemplo um pouco melhorado:

import javax.swing.*;
import java.awt.*;
import javax.swing.table.*;
import javax.swing.event.*;

public class Estudos extends JFrame{
  public Estudos(){
    super("Exemplo de uma tabela simples");
		
    // colunas da tabela
    String[] colunas = {"Cidade", "Estado", "Habitantes"};
		
    // conteúdo da tabela	
    Object[][] conteudo = {
        {"Goiânia", "GO", "43.023.432"},
        {"São Paulo", "SP", "5.343.234"},
        {"Rio de Janeiro", "RJ", "6.434.212"},
        {"Jussara", "GO", "87.454"},
        {"Barra do Garças", "MT", "64.344"}
    };
        
    // constrói a tabela
    final JTable tabela = new JTable(conteudo, colunas);
    tabela.setPreferredScrollableViewportSize(new Dimension(350, 100));
	
    Container c = getContentPane();
    c.setLayout(new FlowLayout());
	
    for(int i=0;i<tabela.getColumnCount();i++){
       tabela.getColumn(colunas[i]).setCellRenderer(new RendererAlternado());
    }
			
    JScrollPane scrollPane = new JScrollPane(tabela);
    c.add(scrollPane);
    	
    setSize(400, 300);
    setVisible(true);
  }
	
  public static void main(String args[]){
    Estudos app = new Estudos();
    app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  }
}

class RendererAlternado extends DefaultTableCellRenderer{
     public Component getTableCellRendererComponent(     
        JTable table,     
        Object value,     
        boolean isSelected,     
        boolean hasFocus,     
        int row,     
        int column)     
    {     
        Component result = super.getTableCellRendererComponent(       
            table,       
            value,       
            isSelected,       
            hasFocus,       
            row,       
            column       
        );       
                 
        if(row % 2 == 0) {     
            result.setFont(new Font("arial", Font.BOLD, 12));     
            result.setForeground(Color.white);     
            result.setBackground(Color.blue);     
         
        } else{   
             result.setFont(new Font("arial", Font.BOLD, 12));     
             result.setForeground(Color.black);     
             result.setBackground(Color.red);   
        }   
        return result;     
    }  
}
R

Vlw muito bom o exemplo agora só mais uma dúvida hehehe como eu consigo tipo colorir as linhas azuis quando a data tiver abaixo da data de prazo e de vermelho as que tiverem atrasadas? Exemplo: Tenho uma data de prazo do dia 12/03/2012 e a data atual é de 07/05/2012 e tenho outros duas linhas com o prazo de 12/05/2012 e 12/06/2012 na mesma data então a configuração da pintura ficaria a primeira linha vermelha e as 2 outras de baixo azuis como faz essa pintura dinamicamente não sendo uma condição estática? obrigado

al.barbosa

rcarauta,

Para fazer isso você poderia colocar todo o código dentro do getTableCellRendererComponent. De acordo com a row, você poderia procurar na table qual o prazo e formatar a célula. Mas imagine comparar o prazo da linha com a data de hoje para cada célula. Se a tabela for muito grande, poderá ficar muito lento.
Por isso estou colocando a seguinte solução: crio um vetor com um elemento para cada linha da tabela (int[] cores). Armazeno no vetor um valor para as linhas com prazo vencido, e outro para as linhas dentro do prazo. Passo o vetor para o construtor do CellRenderer. Utilizo o vetor no getTableCellRendererComponent para formatar as linhas.
Nessa solução, só preciso comparar o prazo com a data de hoje uma vez para cada linha, assim ficará mais rápido.
Abaixo a solução:

import javax.swing.*;
import java.awt.*;
import javax.swing.table.*;
import javax.swing.event.*;
import java.util.*;
import java.text.*;

public class Estudos1 extends JFrame{

  public Estudos1(){
    super("Exemplo de uma tabela simples");
		
    // colunas da tabela
    String[] colunas = {"Cidade", "Estado", "Codigo", "Prazo"};
		
    // conteúdo da tabela	
    Object[][] conteudo = {
        {"Goiânia", "GO","3", "01/01/2000"},
        {"São Paulo", "SP","3", "01/01/2020"},
        {"Rio de Janeiro", "RJ","2", "01/01/2000"},
        {"Jussara", "GO","1", "01/01/2000"},
        {"Barra do Garças", "MT","4", "01/01/2020"}
    };
        
    // constrói a tabela
    final JTable tabela = new JTable(conteudo, colunas);
    tabela.setPreferredScrollableViewportSize(new Dimension(350, 100));
	
    Container c = getContentPane();
    c.setLayout(new FlowLayout());

    //vetor para armazenar as cores (vermelho ou azul)
    int[] cores = new int[tabela.getRowCount()];

    DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT);
    Date hoje = new Date();
    int colunaPrazo = tabela.getColumn("Prazo").getModelIndex();

    //preencho o vetor com as cores de acordo com o prazo
    for(int i=0;i<tabela.getRowCount();i++){
        try{
           Date prazo = df.parse((String) conteudo[i][colunaPrazo]);
           if(prazo.compareTo(hoje)<0 ) {
              cores[i]= RendererPrazo.VERMELHO;
           } else{               
              cores[i]= RendererPrazo.AZUL;
           }   
        }catch(ParseException pe){
           cores[i]= RendererPrazo.AZUL;
        }
    }

    RendererPrazo rp = new RendererPrazo(cores);
	
    for(int i=0;i<tabela.getColumnCount();i++){
       tabela.getColumn(colunas[i]).setCellRenderer(rp);
    }

    JScrollPane scrollPane = new JScrollPane(tabela);
    c.add(scrollPane);
    	
    setSize(400, 300);
    setVisible(true);
  }
	
  public static void main(String args[]){
    Estudos1 app = new Estudos1();
    app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  }
}

class RendererPrazo extends DefaultTableCellRenderer{
     private int[] cores;
     final static int VERMELHO=1;        // constante para linha vermelha
     final static int AZUL=2;            // constante para linha azul

     //o construtor de RendererPrazo recebe o vetor com as cores das linhas
     public RendererPrazo(int[] cores){
        super();
        this.cores = cores;
     }

     public Component getTableCellRendererComponent(     
        JTable table,     
        Object value,     
        boolean isSelected,     
        boolean hasFocus,     
        int row,     
        int column)     
    {     
        Component result = super.getTableCellRendererComponent(       
            table,       
            value,       
            isSelected,       
            hasFocus,       
            row,       
            column       
        );

        //formato de acordo com a linha, utilizando o vetor cores
        if(cores[row] == RendererPrazo.VERMELHO) {     
           result.setFont(new Font("arial", Font.BOLD, 12));     
           result.setForeground(Color.black);     
           result.setBackground(Color.red);         
        } else{               
           result.setFont(new Font("arial", Font.BOLD, 12));     
           result.setForeground(Color.white);     
           result.setBackground(Color.blue);
        }   
        return result;     
    }  
}
al.barbosa

Segue uma outra solução melhorada. Acho que é melhor deixar toda a responsabilidade pela formatação dentro da classe RendererPrazo, melhora a coesão. Nesta solução o construtor de RenderePrazo recebe a JTable e monta o vetor internamente.

import javax.swing.*;
import java.awt.*;
import javax.swing.table.*;
import javax.swing.event.*;
import java.util.*;
import java.text.*;

public class Estudos1 extends JFrame{

  public Estudos1(){
    super("Linhas vermelhas em atraso");
		
    // colunas da tabela
    String[] colunas = {"Cidade", "Estado", "Codigo", "Prazo"};
		
    // conteúdo da tabela	
    Object[][] conteudo = {
        {"Goiânia", "GO","3", "01/01/2000"},
        {"São Paulo", "SP","3", "01/01/2020"},
        {"Rio de Janeiro", "RJ","2", "01/01/2000"},
        {"Jussara", "GO","1", "01/01/2000"},
        {"Barra do Garças", "MT","4", "01/01/2020"}
    };
        
    // constrói a tabela
    final JTable tabela = new JTable(conteudo, colunas);
    tabela.setPreferredScrollableViewportSize(new Dimension(350, 100));
	
    Container c = getContentPane();
    c.setLayout(new FlowLayout());

    RendererPrazo rp = new RendererPrazo(tabela);
	
    for(int i=0;i<tabela.getColumnCount();i++){
       tabela.getColumn(colunas[i]).setCellRenderer(rp);
    }

    JScrollPane scrollPane = new JScrollPane(tabela);
    c.add(scrollPane);
    	
    setSize(400, 300);
    setVisible(true);
  }
	
  public static void main(String args[]){
    Estudos1 app = new Estudos1();
    app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  }
}

class RendererPrazo extends DefaultTableCellRenderer{
     private int[] cores;
     final static int VERMELHO=1;        // constante para linha vermelha
     final static int AZUL=2;            // constante para linha azul

     public RendererPrazo(JTable tabela){
        super();
        montaVetorCores(tabela);
     }

     public Component getTableCellRendererComponent(     
        JTable table,     
        Object value,     
        boolean isSelected,     
        boolean hasFocus,     
        int row,     
        int column)     
    {     
        Component result = super.getTableCellRendererComponent(       
            table,       
            value,       
            isSelected,       
            hasFocus,       
            row,       
            column       
        );

        //formato de acordo com a linha, utilizando o vetor cores
        if(cores[row] == RendererPrazo.VERMELHO) {     
           result.setFont(new Font("arial", Font.BOLD, 12));     
           result.setForeground(Color.black);     
           result.setBackground(Color.red);         
        } else if(cores[row] == RendererPrazo.AZUL) {               
           result.setFont(new Font("arial", Font.BOLD, 12));     
           result.setForeground(Color.white);     
           result.setBackground(Color.blue);
        }   
        return result;     
    }

    private void montaVetorCores(JTable tabela){
       cores = new int[tabela.getRowCount()];

       DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT);
       Date hoje = new Date();
       int colunaPrazo = tabela.getColumn("Prazo").getModelIndex();

       //preencho o vetor com as cores de acordo com o prazo
       for(int i=0;i<tabela.getRowCount();i++){
          try{
             Date prazo = df.parse((String) tabela.getValueAt(i,colunaPrazo));
             if(prazo.compareTo(hoje)<0 ) {
                cores[i]= RendererPrazo.VERMELHO;
             } else{               
                cores[i]= RendererPrazo.AZUL;
             }   
          }catch(ParseException pe){
             cores[i]= RendererPrazo.AZUL;
          }
       }
    }
}
R

Muito boas as soluções era exatamente o as duas coisas que eu estava querendo muito bom mesmo me ajudo pacas. Agora uma ultima cosia heheheh, e uma pesquisa como faz tava usando o DefaultTableModel vi alguns tutoriais mas todos usavam Threads para usar a pesquisa tudo dentro do método run() eu queria saber se não tem um outro jeito de fazer uma pesquisa tipo eu digito um valor em um JTextField apaerto um JButton e ele me retorna todas as linhas contendo esse dado exemplo eu digito GO e quero todas as linhas que tem GO aparecendo apenas elas obrigado pela ajuda já me deu uma força no sistema que estou desenvolvendo.

al.barbosa

rcarauta,

Vai ficar bom este sistema.
Você pode usar a classe RowFilter. O método regexFilter() cria um filtro utilizando expressões regulares. O primeiro parâmetro é uma String com a expressão regular do filtro. O segundo parâmetro é o número da coluna utilizada para aplicar o filtro.
Se o primeiro parâmetro de regexFilter() for exatamente a String de filtro, você terá um filtro case-sensitive. Ou seja, o filtro vai diferenciar maiúsculas de minúsculas. Por isso estou colocando "(?i)" no início da String de filtro. Dessa forma teremos uma expressão regular que não diferencia maiúsculas de minúsculas (case-insensitive).
O primeiro exemplo aplica um filtro utilizando o valor de uma coluna (Estado):

import javax.swing.*;
import java.awt.*;
import javax.swing.table.*;
import java.awt.event.*;
import javax.swing.event.*;
import java.util.regex.*;

public class Filtro extends JFrame{
  private TableRowSorter<TableModel> sorter;
  public Filtro(){
    super("Exemplo de filtro");	

   // colunas da tabela   
    String[] colunas = {"Cidade", "Estado", "Habitantes"};   
           
    // conteúdo da tabela     
    Object[][] conteudo = {   
        {"Goiânia", "GO", "43.023.432"},   
        {"São Paulo", "SP", "5.343.234"},   
        {"Rio de Janeiro", "RJ", "6.434.212"},   
        {"Jussara", "GO", "87.454"},   
        {"Barra do Garças", "MT", "64.344"}   
    };   
           
    // constrói a tabela   
    final JTable tabela = new JTable(conteudo, colunas);   
    tabela.setPreferredScrollableViewportSize(new Dimension(350, 100));   
 
    TableModel model = tabela.getModel();
    sorter = new TableRowSorter<TableModel>(model);
    tabela.setRowSorter(sorter);
	
    Container c = getContentPane();
    c.setLayout(new FlowLayout());

    final JTextField txEstado = new JTextField(10);
    c.add(new JLabel("Digite o estado:"));
    c.add(txEstado);

    JButton btFiltro = new JButton("Filtrar");
    btFiltro.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        String texto = txEstado.getText();
        try {
          sorter.setRowFilter(RowFilter.regexFilter("(?i)"+texto,1));
        } catch (PatternSyntaxException pse) {
          JOptionPane.showMessageDialog(null,"Bad regex pattern");
        }
      }
    });
			
    JScrollPane scrollPane = new JScrollPane(tabela);
    c.add(scrollPane);
    c.add(btFiltro);
    	
    setSize(400, 300);
    setVisible(true);
  }
	
  public static void main(String args[]){
    Filtro app = new Filtro();
    app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  }
}

O segundo exemplo aplica um filtro utilizando o valor de duas colunas (Cidade e Estado). Os filtros para cada coluna são armazenados num ArrayList. Se você precisar de mais filtros, basta acrescentar no ArrayList.

import javax.swing.*;
import java.awt.*;
import javax.swing.table.*;
import java.awt.event.*;
import javax.swing.event.*;
import java.util.*;
import java.util.regex.*;

public class Filtro2 extends JFrame{
  private TableRowSorter<TableModel> sorter;
  public Filtro2(){
    super("Exemplo de uma tabela simples");	

   // colunas da tabela   
    String[] colunas = {"Cidade", "Estado", "Habitantes"};   
           
    // conteúdo da tabela     
    Object[][] conteudo = {   
        {"Goiânia", "GO", "43.023.432"},   
        {"São Paulo", "SP", "5.343.234"},   
        {"Rio de Janeiro", "RJ", "6.434.212"},   
        {"Jussara", "GO", "87.454"},   
        {"Barra do Garças", "MT", "64.344"}   
    };   
           
    // constrói a tabela   
    final JTable tabela = new JTable(conteudo, colunas);   
    tabela.setPreferredScrollableViewportSize(new Dimension(350, 100));   
 
    TableModel model = tabela.getModel();
    sorter = new TableRowSorter<TableModel>(model);
    tabela.setRowSorter(sorter);
	
    Container c = getContentPane();
    c.setLayout(new FlowLayout());

    final JTextField txCidade = new JTextField(10);
    c.add(new JLabel("Cidade:"));
    c.add(txCidade);

    final JTextField txEstado = new JTextField(2);
    c.add(new JLabel("Estado:"));
    c.add(txEstado);

    JButton btFiltro = new JButton("Filtrar");
    btFiltro.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        try {
          ArrayList<RowFilter<Object,Object>> filters = new ArrayList<RowFilter<Object,Object>>(2);
          filters.add(RowFilter.regexFilter("(?i)"+txCidade.getText(),0));
          filters.add(RowFilter.regexFilter("(?i)"+txEstado.getText(),1));
          sorter.setRowFilter(RowFilter.andFilter(filters));
        } catch (PatternSyntaxException pse) {
          JOptionPane.showMessageDialog(null,"Bad regex pattern");
        }
      }
    });
			
    JScrollPane scrollPane = new JScrollPane(tabela);
    c.add(scrollPane);
    c.add(btFiltro);
    	
    setSize(400, 300);
    setVisible(true);
  }
	
  public static void main(String args[]){
    Filtro2 app = new Filtro2();
    app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  }
}
Criado 4 de maio de 2012
Ultima resposta 10 de mai. de 2012
Respostas 7
Participantes 2