Como Reordenar JTable com lista de Objetos

2 respostas
javer

Alguém tem algum exemplo de como reordenar os dados em um JTable, porém usando uma lista (ArrayList) de objetos?

O meu está funcionando bem, o problema é quando eu tento pegar um objeto da lista (uma linha) usando o tabela.getSelectedRow() como índice esse índice não corresponde a ao índica da lista (ArrayList) que está no modelo, aí quando o usuário dá duplo-clique para abrir o cadastro acaba abrindo *outro* cadastro.

Por exemplo: tenho uma lista assim:
ArrayList<Producao> lista = new ArrayList<Producao>(); // supondo que esteja completa

// Objeto Producao
public class Producao extends Object implements Serializable, Comparable, Cloneable {

    ...

    @Override
    public String toString() {
        return this.getOrdemServico().getTitulo();
    }

    @Override
    public boolean equals(Object obj) {
        if (obj instanceof Producao) {
            if (this == obj || (this.getCodigo() == ((Producao) obj).getCodigo())) {
                return true;
            } else {
                return false;
            }
        } else {
            return false;
        }
    }

    @Override
    public int hashCode() {
        return (int) (this.getCodigo() * 256);
    }

    public int compareTo(Object o) {
        if (this.hashCode() < o.hashCode()) {
            return -1;
        } else if (this.hashCode() == o.hashCode()) {
            return 0;
        } else if (this.hashCode() > o.hashCode()) {
            return 1;
        } else {
            return 1;
        }
    }

    // getters e setters
    ...
}

Não vou enviar tudo agora porque é muito código, mas se alguém quiser ver o resto eu envio o TableSorter, TableModel, TableHeaderListener e tals.

Eu preciso que mesmo depois de reordenada a listagem de dados quando der duplo clique pegar o Objeto da linha, só sei fazer isso pegando o index da linha clicada, mas se faço isso não pego o Objeto verdadeiro na lista, ou seja, quando reordena na tela os índices na lista no modelo permanecem os mesmos:
int index = tabelaProducao.rowAtPoint(evt.getPoint());
// Aqui não pega o Objeto Produção correto do modelo
Producao pro = ((ProducaoTableModel) tabelaProducao.getModel()).getItemAt(index);
No modelo tenho esse trecho de código:
public Producao getItemAt(int index) {
        if (lista == null || lista.size() == 0) {
            return null;
        } else {
            return lista.get(index);
        }
    }

Se alguém puder ajudar, ou pelo menos discutir o assunto eu agradeço.

2 Respostas

davidtiagoconceicao

Opa, já que você sugeriu discutir o assunto, aí vamos.
Eu não analisei detalhadamente seu código, mas pelo que entendi, o que pode resolver seu problema seria disparar um evento para atualização da tela sempre que as informações forem reorganizadas no modelo. Procure pelos métodos de fireTableDataChanged e fireTableCellUpdated.

Porém não acho o mais correto ordenar dados no tableModel. Em minhas aplicações, o tableModel costuma seguir a ordenação estabelecida pela camada de controle. Ou seja, os dados já chegam na ordem correta para o tableModel e, se necessário, este solicita a reordenação ao controle.

T

http://publicobject.com/glazedlists/

Criado 4 de fevereiro de 2009
Ultima resposta 11 de fev. de 2009
Respostas 2
Participantes 3