Projeto Towel: AutoFiltro em JTable

Não não tem. Era isso q eu gostaria de saber. Sobre esse tratamento.

Segue minha classe:

public enum ComunicacaoColumns implements Column<Comunicacao_Dias> 
{
        CARRO("Carro") 
        {  
            //Esse método precisa retornar para o table o ID da pessoa  
            public Object getValue(Comunicacao_Dias p)  
            {  
                return p.getCarro();  
            }          
        },   
        COMUNICACAO_ANTERIOR("Comunicação Anterior") 
        {  
           public Object getValue(Comunicacao_Dias p)  
           {  
               return p.getComunicacao_anterior();  
           }          
        },   
        
       ULTIMA_COMUNICACAO("Última Comunicação")  
       {  
           public Object getValue(Comunicacao_Dias p)  
           {  
               return p.getUltima_comunicacao();  
           }          
       },
       
       DIAS("Dias")
       {
       	public Object getValue(Comunicacao_Dias p)
       	{
       		return p.getDias();
       	}
       };
     
      //Daqui para baixo, são configurações que valem para todas as colunas  

    private final String nome;  
     
	private ComunicacaoColumns(String nome) 
	{  
		this.nome = nome;  
	}  
     
	public Class< ? > getColumnClass() 
	{  
		return Object.class;  
	}  
	 
	public String getName() 
	{  
		return nome;  
	}  
	 
	public TableCellRenderer getRenderer() 
	{  
		return null;  
	}  
	 
	public int getModelIndex() 
	{  
		return ordinal();  
	}  
	
	public int getWidth() 
	{  
		return 100;  
	}

Como seria um exemplo desse tratamento?

Criar um outro construtor recebendo parâmetro do tipo int e retornando?
Como seria chamado isso dentro da classe?

Obrigado.

O seu getColumnClass() está sempre retornando Object.class.

Você deve fazer retornar Integer.class para as colunas inteiras. Veja com a coluna Dias:

public enum ComunicacaoColumns implements Column&lt;Comunicacao_Dias&gt; 
{
   CARRO(&quot;Carro&quot;) {  
      //Esse método precisa retornar para o table o ID da pessoa  
      public Object getValue(Comunicacao_Dias p)  {  
         return p.getCarro();  
      }          
   },   
   COMUNICACAO_ANTERIOR(&quot;Comunicação Anterior&quot;) {  
      public Object getValue(Comunicacao_Dias p) {  
         return p.getComunicacao_anterior();  
      }          
   },          
   ULTIMA_COMUNICACAO(&quot;Última Comunicação&quot;)  {  
      public Object getValue(Comunicacao_Dias p)  {  
         return p.getUltima_comunicacao();  
      }          
   },       
   DIAS(&quot;Dias&quot;) {
      public Object getValue(Comunicacao_Dias p) {
         return p.getDias();
      }

      public Class&lt; ? &gt; getColumnClass() {  
		return Integer.class;  
      }  
   };
     
   //Daqui para baixo, são configurações que valem para todas as colunas  

   private final String nome;  
     
   private ComunicacaoColumns(String nome)  {  
      this.nome = nome;  
   }  
     
   public Class&lt; ? &gt; getColumnClass() {  
      return Object.class;  
   }  
	 
   public String getName() {  
      return nome;  
   }  
	 
   public TableCellRenderer getRenderer() {  
      return null;  
   }  
	 
   public int getModelIndex() {  
      return ordinal();  
   }  
	
   public int getWidth() {  
      return 100;  
   }
}

Era isso mesmo. O engraçado é que os dados dessa coluna agora ficaram alinhados para a direta (ao contrario de quando estava retornando do tipo String). E ao contrário das outras colunas.

É assim mesmo? Existe algum método que alinha isso centralizado por exemplo, ou isso ja faz parte do layout do table e é outra história?

Muito obrigado, e é só isso.

Abraço.

Isso depende é do renderer da coluna. Por padrão ele usa o DefaultRenderer que alinha números a direita, e demais dados a esquerda.

[quote=ViniGodoy]Como está o seu TableModel (ou seus Columns)? É ele que indica como as colunas devem ser ordenadas.
E tem sim, um tratamento especial para inteiros.[/quote]

o problema não é como é ordenado o problema é que eu não quero que ordene olhe a imagem da minha JTable para entenderem melhor o que eu quero


porque pelo menos ao meu ver poder ordenar uma coluna de documento ou telefone fica esquisito mais se o usuário querer pegar todos os telefones que tenha o mesmo código de área ou se lembrar de parte do documento o personalizar seria ótimo

Então, como eu falei, esse suporte ele não dá.

Você tem a opção de desabilitar totalmente o filtro, mas eu deixaria a possibilidade de ordenação. Fica meio ridículo, mas é um preço muito pequeno a se pagar por uma funcionalidade tão bacana.
E vai saber, as vezes seu usuário vai querer listar todos os números ordenados por código de área…

Vini parabéns pelo post… Me poupou um tempão! :shock:
Ficou muito bom esse seu AutoFiltro e o table model!

Vou começar a estudar o projeto do mark agora e talvez implementá-lo no meu projeto. :wink:
Parece ser um pouco mais interessante por trabalhar com anotações. Tenho tabelas do banco com praticamente 50 ou mais colunas.
É um pouco doloroso escrever enums para tabelas grandes assim. :shock:
Mas ainda assim é bem melhor que trabalhar com DefaultTableModel e de quebra tem o auto filtro que é muito bom! :wink:

Sim. E o auto-filtro funciona com qualquer TableModel. Incluindo o (argh) Default e o do Mark. :slight_smile:

Realmente o modelo do Mark é bem mais interessante! Dispensa comentários! :wink:
Vini, o auto filtro realmente funfa de boa com o modelo do Mark. Vcs estão de parabéns…
Nem gosto de imaginar se tivesse que construir isso do zero… :shock:

Obrigado.

Hehe, fizemos um bom trabalho juntos(na realidade foi separado, mas os dois são tão independentes que funcionam bem juntos, ironico não?) :stuck_out_tongue:

Obrigado aos comentários também.

[quote=Marky.Vasconcelos]Hehe, fizemos um bom trabalho juntos(na realidade foi separado, mas os dois são tão independentes que funcionam bem juntos, ironico não?) :stuck_out_tongue:

Obrigado aos comentários também.[/quote]

Sim, é irônico…
Mark, você não pensa em implementar o auto filtro direto no seu projeto não? Seria uma boa :?:

Baixei os fontes do seu projeto e estou estudando-os.

Mais uma vez… valeu pela força.

Sim, pretendo colocar o auto-filtro no meu projeto, só estou procurando tempo para fazer essas coisas.

Mark,
Como vc trata os dados do tipo Double para ficarem formatados com as casas decimais e tal e alinhar o texto a direita?

No meu caso, os campos na classe POJO estão declarados como BigDecimal, mas preciso mostrá-los como double porque como BigDecimal os números ficam sem formatação
e quando o número é 0 ele mostra como 0E-9…

[code]import java.text.DecimalFormat;
import mark.utils.bean.Formatter;

/**
*

  • @author jsilva
    */
    public class DoubleFormatter implements Formatter{
    DecimalFormat formatter = new DecimalFormat();
    public Object format(Object o) {
    String valor = formatter.format(o);
    return valor;
    }

    public Object parse(Object o) {
    return Double.parseDouble(o.toString());
    }

    public String getName() {
    return “double”;
    }

}[/code]

Essa é a classe que fiz para formatar o valor, mas como ele retorna uma String os valores ficam alinhados a esquerda!
Como vc faz pra informar que a classe de uma determinada coluna é um Double ou outro tipo qualquer?

Depende do que voce quer fazer, mostrar um double na tabela não vai resolver seu problema, se voce quiser formatado voce pode usar o DecimalFormatter e converter para String mesmo.

Só algo importante, o método format deve declarar o retorno do mesmo tipo que voce quer exibir na coluna, nos eu caso seria mais ou menos o seguinte:

import java.text.DecimalFormat;
import mark.utils.bean.Formatter;

/**
 *
 * @author jsilva
 */
public class DoubleFormatter implements Formatter{
    DecimalFormat formatter = new DecimalFormat("##,##");
    public String format(Object o) {
        String valor = formatter.format(o);
        return valor;
    }

    public Object parse(Object o) {
        return Double.parseDouble(o.toString());
    }

    public String getName() {
        return "double";
    }

}

Tá, no format não declarei o retorno do que quero exibir porque não quero limitar as casas, assim como tá ele faz o que quero que é colocar o separador de milhares e só.

Mas na verdade, o que quero é especificar o tipo de classe de uma determinada coluna, por exemplo com uma anotação “columnType” onde eu informe o tipo de classe
a ser utilizada para determinada coluna.

Não posso utilizar uma Double direto porque preciso do tipo como BigDecimal, os campos têm muitas casas decimais e não posso perder a precisão deles.

Mas voltando… é basicamente isso, pelo que percebi, vc utiliza o tipo declarado na variável para definir o tipo de classe a ser utilizado na coluna.
O que quero é poder mudar o tipo manualmente.

É possível fazer isso com o seu model?

Ai que está o segredo, o tipo da coluna é exatemente o que voce coloca na assinatura do Formatter.

 public String format(Object o) { 

Será String.

 public boolean format(Object o) { 

Será Boolean, o wraper, por que modifiquei para utilizar apenas os wrapers como class.

E assim vai, voce pode colocar qualquer objeto, desde que tenha um Renderer apropriado.

[quote=Marky.Vasconcelos]Ai que está o segredo, o tipo da coluna é exatemente o que voce coloca na assinatura do Formatter.

 public String format(Object o) { 

Será String.

 public boolean format(Object o) { 

Será Boolean, o wraper, por que modifiquei para utilizar apenas os wrapers como class.

E assim vai, voce pode colocar qualquer objeto, desde que tenha um Renderer apropriado.[/quote]

Você é o cara!! :smiley:
Nem pensei nisso… :shock:

Eu já estava aqui fuçando no source e implementando uma anotação “columnType”… :?

Valeu Mark…

Eu também tinha pensado no columnType, mas ia ser meio idiota ficar declarando nas annotations esse tipo, ainda mais que em um caso voce pode querer mostrar como String e outro como double, e isso não seria resolvido com a annotation.

Só se lembre, o método parse recebe um objeto do mesmo tipo que o format retorna.

[quote=Marky.Vasconcelos]Eu também tinha pensado no columnType, mas ia ser meio idiota ficar declarando nas annotations esse tipo, ainda mais que em um caso voce pode querer mostrar como String e outro como double, e isso não seria resolvido com a annotation.

Só se lembre, o método parse recebe um objeto do mesmo tipo que o format retorna.[/quote]

É verdade, a solução do Formatter foi bem mais inteligente, ficou realmente muito bom.
Parabéns pelo trabalho.

Boa noite a todos.

Vini, eu me deparei com a seguinte situação. Quando eu mando filtrar os dados do table eu faço um FOR EACH e pego a lista de dados na ordem em que foram filtrados ou ordenados, até ai normal.
Mas e quando eu não tenho todos os atributos da minha classe de negócio no meu table. Nesse caso, minha classe de negócio (lista) tem 8 atributos, e fica inviável representar todos no table, então eu só exibo 3 atributos. A questão é: existe a possibilidade de quando ordenado esses 3 atributos no meu table, ordenar juntamente minha lista com todos os 8 atributos?

Desde já agradeço a atenção.

Obrigado.