[RESOLVIDO] Duvida Jtable

4 respostas
java
abelgomes

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;
    
    }
    
    <a class="mention" href="/u/override">@Override</a>
    
    public int getRowCount() {
    
    return dados.size();
    
    }
    
    <a class="mention" href="/u/override">@Override</a>
    
    public int getColumnCount() {
    
    return colunas.length;
    
    }
    
    <a class="mention" href="/u/override">@Override</a>
    
    public String getColumnName(int column) {
    
    return colunas[column];
    
    }
    
    <a class="mention" href="/u/override">@Override</a>
    
    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?

4 Respostas

D

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.

abelgomes

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?

abelgomes

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;
      }
    <a class="mention" href="/u/override">@Override</a>
    
    public int compareTo(NumberAsString o) {
    
    return o.getValue().compareTo(getValue());
    
    }
    
    <a class="mention" href="/u/override">@Override</a>
    
    public String toString() {
    
    return label;
    
    }
    

}

D

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.

Criado 12 de setembro de 2018
Ultima resposta 12 de set. de 2018
Respostas 4
Participantes 2