DataTable Ordenada

15/09/2008

2

Alguem sabe como fazer ordenação pelas colunas de uma DataTable ?

Uso JPA

Obrigado
Responder

Posts

11/02/2009

Anonymous

Aqui segue o código da tableModel:
package com.sismed.tablemodel;

import java.util.Arrays;
import java.util.Comparator;

import javax.swing.table.DefaultTableModel;

import org.apache.log4j.Logger;

import com.Usuario;
import com.resources.Messages;

public class UsuarioTableModel extends DefaultTableModel{
private Usuario[] vetorUsuarios;
private static String[] rotulosDasColunas = {Messages.getString("ColumnLogin"),Messages.getString("ColumnPermissao")};
private booleanordemCrescente;// Ordem de ordenação
private static  Logger logger = Logger.getLogger(IWG2.class);
/** 
 *  Uma instância dessa classe deve necessariamente
 *  estar ligada a um array de usuários.
 */
public UsuarioTableModel(Usuario[] vetUsuarios)
{
vetorUsuarios = vetUsuarios;
super.setColumnIdentifiers(rotulosDasColunas);
}
/** 
 * Esse método retorna o valor que deve ser impresso
 * em cada célula da tabela.
 */
public Object getValueAt(int linha, int coluna)
{
switch(coluna)
{
case 0:
return vetorUsuarios[linha].getNomusu();
case 1:

if (vetorUsuarios[linha].getPermusu().intValue() == 0) {
return Messages.getString("permissaoCadastroRemocaoVisualizacao");
} 

else if (vetorUsuarios[linha].getPermusu().intValue() == 1) {

} 

else if (vetorUsuarios[linha].getPermusu().intValue() == 2) {
return Messages.getString("permissaoRemocaoVisualizacao");
}

else  if (vetorUsuarios[linha].getPermusu().intValue() == 3){
return Messages.getString("permissaoVisualizacao");
}

default: return "-";
}
}
/** 
 * Esse método diz ao JTable que nenhuma célula é
 * editável.
 */
public boolean isCellEditable(int row, int col)
    { 
return false; 
}
/** 
 * Retorna o número de linhas (produtos) da tabela.
 */
public int getRowCount()
{
if (vetorUsuarios == null)
return 0;
return vetorUsuarios.length;
}

/** 
 * Retorna o número de colunas da tabela
 */
public int getColumnCount()
{
return rotulosDasColunas.length;
}

/**
 * Retorna o objeto correspondente a uma linha
 * da tabela
 * @param indice - índice da linha da tabela
 * @return   ret - Usuário
 */
public Usuario getUsuario(int indice)
{
Usuario ret = null;
if (indice < vetorUsuarios.length)
ret = vetorUsuarios[indice];
return ret;
}

/**
 * Ordena o vetor de usuários de acordo com o número passado como
 * parâmetro.
 * 
 *  @author Ulisses Nunes
 * 
 * @param numColuna - Número da coluna clicada na tabela
 */
public void ordenarTabela(int numColuna)

// Ordenando pelo nome do usuario
if (numColuna == 0)
{
try {
Arrays.sort(vetorUsuarios,new Comparator() 
{
    public int compare( Object obj1, Object obj2 ) 
    {
 Usuario usu1 = (Usuario) obj1;
 Usuario usu2 = (Usuario) obj2;
 if (usu1 == null || usu1.getNomusu() == null)
 return +1;
 else if (usu1 == null || usu1.getNomusu() == null)
 return -1;
 else
     return (usu1.getNomusu().compareToIgnoreCase(usu2.getNomusu()));
 }
});
} catch (RuntimeException e) {
logger.error("Erro de ordenação: UsuarioTableModel coluna 0:");
logger.error(e.getMessage());
System.out.println("Erro de ordenação: UsuarioTableModel coluna 0:");
e.printStackTrace();
}
}
// Ordenando pela permissão do usuario
else if (numColuna == 1)
{
try {
Arrays.sort(vetorUsuarios,new Comparator() 
{
    public int compare( Object obj1, Object obj2 ) 
    {
 Usuario usu1 = (Usuario) obj1;
 Usuario usu2 = (Usuario) obj2;   
 if (usu1 == null || usu1.getPermusu() == null)
 return +1;
 else if (usu1 == null || usu1.getPermusu() == null)
 return -1;
 else
     return (usu1.getPermusu().compareTo(usu2.getPermusu()));
 }
});
} catch (RuntimeException e) {
logger.error("Erro de ordenação: UsuarioTableModel coluna 1:");

System.out.println("Erro de ordenação: UsuarioTableModel coluna 1:");
e.printStackTrace();
}
}

// Invertendo o vetor se a ordem for decrescente
if (!ordemCrescente)
{
Usuario[] vetorReverso = new Usuario[vetorUsuarios.length];
for (int i=0; i<vetorUsuarios.length; i++)
vetorReverso[i] = vetorUsuarios[vetorUsuarios.length-i-1];
vetorUsuarios = vetorReverso;
}
ordemCrescente = !ordemCrescente;
}

}


Na tabela (no meu caso tabelaUsuario) você adiciona o listener abaixo:
tableHeaderUsuario.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent e) {
UsuarioTableModel modelo = (UsuarioTableModel) tabelaUsuario.getModel();
// Ordenando tabela de acordo com a coluna clicada
modelo.ordenarTabela(tableHeaderUsuario.columnAtPoint(tableHeaderUsuario.getMousePosition()));
tabelaUsuario.invalidate();
}
});

Responder