[RESOLVIDO] Duvida Jtable

Bom dia moçada, estou fazendo um Jtable usando meu modelo que extends AbstractTableModel, segue o código do modelo:

`

package tela;

import java.text.NumberFormat;
import java.util.List;
import javax.swing.table.AbstractTableModel;
import pojo.Jogador;

/**
*

  • @author Abel Neto
    */
    public class ModeloTabela extends AbstractTableModel {

    private List dados;
    private String colunas[] = {“XP”,“Vila”,“CV”,“Tropas Doadas”, “Tropas Recebidas”,“Estrelas de Guerra”,“Rei”, “Rainha”, “Guardião”};
    private NumberFormat nf = NumberFormat.getInstance();

    public ModeloTabela(List jogadores) {
    this.dados = jogadores;
    }

    @Override
    public int getRowCount() {
    return dados.size();
    }

    @Override
    public int getColumnCount() {
    return colunas.length;
    }

    @Override
    public String getColumnName(int column) {
    return colunas[column];
    }

    @Override
    public Object getValueAt(int linha, int coluna) {
    switch (coluna) {
    case 0:
    return dados.get(linha).getXpLavel();
    case 1:
    return dados.get(linha).getName().replaceAll(""", “”);
    case 2:
    return dados.get(linha).getThLavel();
    case 3:
    return nf.format(dados.get(linha).getTroopsDonated());
    case 4:
    return nf.format(dados.get(linha).getTroopsReceived());
    case 5:
    return nf.format(dados.get(linha).getWarStars());
    case 6:
    return nf.format(dados.get(linha).getBarbarianKing());
    case 7:
    return nf.format(dados.get(linha).getArcherQueen());
    case 8:
    return nf.format(dados.get(linha).getGrandWarden());
    }
    return null;
    }

    public Object getValueAt(int linha) {
    return dados.get(linha);
    }

}
`
Depois de preencher a lista, e jogar na Jtable, estou usando o autoCreateRowSorter, porém, quando estou classificando pela coluna, não está obedecendo a ordem, ou seja, vem 8,7,50,49,48,47,46 quando deveria vir 50,49,48,47,46,8,7

Alguém sabe dizer se estou deixando passar algo?

Você precisa sobrescrever o método getColumnClass(int columnIndex), por exemplo:

@Override
public Class<?> getColumnClass(int columnIndex) {
switch (columnIndex) {
case 0:
return Integer.class;
case 1:
return Double.class;
default:
throw new IndexOutOfBoundsException(“Column Index out of Bounds”);
}
}

Para ele saber qual a Classe que precisa comparar, pra saber de forma correta quem vem antes ou depois.

E o seu método getValueAt precisa retornar um dado que bata com a Classe retornada em getColumnClass.

Funcionou perfeitamente, mas parcialmente. Nos lugares que tenho números formatados não consigo fazer a ordenação pq os números estão como String.

Sabe como resolver isso?

Resolvi criando a classe

/*
  • To change this license header, choose License Headers in Project Properties.
  • To change this template file, choose Tools | Templates
  • and open the template in the editor.
    */

/**
*

  • @author Abel Neto
    */
    public class NumberAsString implements Comparable{
    private String label;
    private Integer value;

    public NumberAsString(String label, Integer valor) {
    this.label = label;
    this.value = valor;

    }

    /**

    • @return the label
      */
      public String getLabel() {
      return label;
      }

    /**

    • @param label the label to set
      */
      public void setLabel(String label) {
      this.label = label;
      }

    /**

    • @return the value
      */
      public Integer getValue() {
      return value;
      }

    /**

    • @param value the value to set
      */
      public void setValue(Integer value) {
      this.value = value;
      }

    @Override
    public int compareTo(NumberAsString o) {
    return o.getValue().compareTo(getValue());
    }

    @Override
    public String toString() {
    return label;
    }

}

Então, como eu disse a classe retornada no getColumnClass precisa ser a mesma do objeto retornado em getValueAt pra ele funcionar corretamente.
Eu não entendi porque você está utilizando NumberFormat para retornar o valor se não tem nenhuma configuração diferente pra apresentação do número. É pra trocar o ponto em número de ponto flutuante para vírgula?

Bom, mas pra você caso for utilizar uma data formatada em outra tabela ou alguém que ver este post em outra situação, a ideia é quando trabalhar com JTable o getValueAt retornar o objeto da classe do atributo mesmo do objeto da classe de negócio. E se for necessário a formatação ou demostração do valor de outra maneira isso seja feito por um TableRenderer customizado, que este então pode formatar fazer o que quiser, que vai mudar a apresentaçao na View sem atrapalhar a interpretação dos valores e tipagens.