JTable ordenação não ordena correntamente

19 respostas
R

Olá pessoal, como faço para a jtable ordenar corretamente uma coluna de números inteiros?
por exemplo, na coluna 1 tem:

1
2
56
40
3
8

se eu for ordenar, o certo seria:
1
2
3
8
40
56

mas ela tá ordenando assim:
1
2
3
40
56
8

alguém sabe como resolver isso ?

obrigado

19 Respostas

F

se a primeira coluna for codigo

no seu sql coloque um order by SeuCodigo asc

R

estou falando de uma JTable, e não estou populando ela com dados do banco.
Alguma outra dica ?

I

O que você está usando como data model da sua tabela? DefaultTableModel?

F

Renan desculpa ai, nao sabia q tu nao tava usando bd

mas peguei um exemplo de ordenacao simples.

Olha se serve esse exemplo

int[] vetor = new int[8]; 
   
    vetor[0] = 11;
    vetor[1] = 65;
    vetor[2] = 2;
    vetor[3] = 60;
    vetor[4] = 16;
    vetor[5] = 21;
    vetor[6] = 30;
    vetor[7] = 10;
	
    // ordena
    Arrays.sort(vetor);
    
    for(int x : vetor){
      System.out.println(x);  
    }  
    
  }

saida

2
    10
    11
    16
    21
    30
    60
    65

nao sei se resolve seu problema

F

Qualquer coisa poste o codigo

R

estou usando o AbstractTableModel,
recebo um map (String, Integer) de uma outra classe ai eu populo a tabela

I

Posta o código onde você seta este model na JTable.

R

bom…
crio o model e seto ele:

fixedColumnModel = new AbstractTableModel() {
            public int getColumnCount() {
                return 2;
            }
            public String getColumnName(int column) {
                switch(column){
                    case 0: return "Qualificação";
                    case 1: return "Qtde";
                    default: return null;
                }
            }
            public int getRowCount() {
                return 6;
            }
            public Object getValueAt(int row, int column) {
                return rows[row][column];
            }
        };
                
        tb.setModel(fixedColumnModel);
I

Adiciona mais esse método:@Override public Class<?> getColumnClass(int columnIndex) { switch(columnIndex){ case 1: return Integer.class; } return String.class; }http://download.oracle.com/javase/1.4.2/docs/api/javax/swing/table/TableModel.html#getColumnName%28int%29

R

isaiaspf:
Adiciona mais esse método:@Override public Class<?> getColumnClass(int columnIndex) { switch(columnIndex){ case 1: return Integer.class; } return String.class; }http://download.oracle.com/javase/1.4.2/docs/api/javax/swing/table/TableModel.html#getColumnName%28int%29

Valeu isaiaspf, deu certo cara :smiley:
valeu mesmo
abraços

A

Poderia postar como ficou? Estou com o mesmo problema…

Estou usando o DB4O. O código para listar no JTable é esse:

public ProdutoTableModel getTableProdutos() {
    Query query = DAO.getObjectContainer().query();
    query.constrain(Produto.class);
    query.descend("id").orderAscending();
    ObjectSet produtoList = query.execute();
    
    ProdutoTableModel tableModel = new ProdutoTableModel();
    while(produtoList.hasNext()) {
      Produto proto = (Produto)produtoList.next();
      tableModel.addProduto(proto);
    }
    return tableModel;
  }

Acontece a mesma falha citada pelo RenanRosa!

Como aplicar a getColumnClass resolveria meu problema? Eu já tenho ela configurada no meu ProdutoTableModel…

I

Posta o método getColumnClass da sua classe ProdutoTableModel.

A
@Override
  public Class<?> getColumnClass(int columnIndex) {
    switch(columnIndex) {
      case 0:
        return String.class;
      case 1:
        return String.class;
      case 2:
        return String.class;
      default:
        throw new IndexOutOfBoundsException("columnIndex fora dos limites!");
    }
  }

Taí!

I

É o seguinte, na coluna que guarda valores inteiros você retorna Integer.class.
Digamos que as colunas de índices 0 e 1 guardam valores inteiros, então ficaria assim:@Override public Class<?> getColumnClass(int columnIndex) { switch(columnIndex) { case 0 : return Integer.class; case 1 : return Integer.class; default : return String.class; } }Ou seja, coluna 0 e 1 são Integer e as outras String.

A

O problema persiste!

Acredito que o problema não está exatamente aí… Como você faz para mostrar os dados? Porque no meu método getTableProdutos() eu não uso getColumnClass() por exemplo!

I

Perguntas:

  1. Sua classe ProdutoTableModel herda AbstractTableModel?
  2. Em que momento você seta este ProdutoTableModel no JTable (suaJTable.setModel(produtoTableModel))?
A

Sim, claro! Tá até anexo…

E a tabela está setada no initComponents()… Na inicialização do Dialog.

tblProdutos.setModel(this.produtoController.getTableProdutos());
I

Aparentemente só seu getColumnClass que tá diferente do que eu imagino como correto.
Acredito que se tu colocar desse jeito ele vai ordernar corretamente:@Override public Class<?> getColumnClass(int columnIndex) { switch(columnIndex) { case 0: return Integer.class; default: return String.class; } }O atributo id da classe Produto é Integer né?

A

É String… Eu preciso que ele seja String… Bem, mas quando você falou sobre o getColumnClass() eu alterei a id do modelo pra int e fiz todas as alterações pra isso, inclusive alterando esse método do jeito que você escreveu… Enfim, não ficou ordenado!

Criado 4 de agosto de 2011
Ultima resposta 5 de ago. de 2011
Respostas 19
Participantes 4