TableModel

4 respostas
kenneth

Fala cambada, beleza?

Eu andei lendo aqueles topicos sobre TableModel e as recomendacoes
pra nao usar DefaultTableModel…

Escrevi uma classe, tentando utilizar Generics, com uma Annotation, que serve
para especificar o titulo da coluna.
A ideia basicamente é so marcar os atributos que se queira mostrar com a Annotation
@Relacao, sendo que a ordem das colunas eh a ordem em que os metodos aparecem no Bean.
Algo como

// 1a coluna da tabela
@Relacao(nomeColuna="Nome")
public String getNome()...

// Por nao ter @Relacao, nao apareceria...
public Long getIdade()...

// 2a coluna da tabela
@Relacao(nomeColuna="E-mail")
public String getEmail()...

Se possivel, gostaria que vcs dessem uma olhada, e talvez algumas dicas para melhorar o codigo.
Talvez ate algum recurso que seja mais facil do que eu usei…

Se puderem, eu agradeco.

A Annotation

package testes;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(value = {ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Relacao {

    public String nomeColuna() default "";
    

}

E o TableModel:

// GenericTableModel
package testes;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import javax.swing.table.AbstractTableModel;

public class GenericTableModel <T> extends AbstractTableModel {

    private List<T> valores;

    public GenericTableModel(Collection<? extends T> pValores) {
          this.valores = new ArrayList(pValores);
    }

    public int getRowCount() {        
        return valores.size();
    }

    public int getColumnCount() {
        int colCont = 0;
        if (!this.valores.isEmpty()){
            T umObjeto = this.valores.get(0);
            Method listaMetodos[] = umObjeto.getClass().getMethods();
            for (Method umMetodo : listaMetodos){
                if (!umMetodo.getName().startsWith("get"))
                    continue;
                if (umMetodo.isAnnotationPresent(Relacao.class)){
                    colCont++;
                }
            }
        }
        return colCont;
    }

    @Override
    public String getColumnName(int coluna) {
        String nomeColuna = "";
        if (!this.valores.isEmpty()) {
            int contador = 0;
            T umObjeto = this.valores.get(0);
            Method listaMetodos[] = umObjeto.getClass().getMethods();
            for (Method umMetodo : listaMetodos){
                if (!umMetodo.getName().startsWith("get")) {
                    continue;
                }
                if (umMetodo.isAnnotationPresent(Relacao.class)){
                    if (contador == coluna){
                        nomeColuna = umMetodo.getAnnotation(Relacao.class).nomeColuna();
                    }
                    contador++;
                }
            }
        }
        return nomeColuna;
    }

    public Object getValueAt(int linha, int coluna) {
        int contador = 0;
        Object retorno = null;
        if (!this.valores.isEmpty()){
            T umObjeto = this.valores.get(linha);

            Method listaMetodos[] = umObjeto.getClass().getMethods();
            for (Method umMetodo : listaMetodos){
                if (!umMetodo.getName().startsWith("get"))
                    continue;

                if (umMetodo.isAnnotationPresent(Relacao.class)){
                    if (contador == coluna){
                        try {
                            retorno = umMetodo.invoke(umObjeto);
                        } catch (IllegalAccessException e){
                            System.out.println("Erro [IllegalAccessException]: " + e.getMessage());
                        } catch (InvocationTargetException e){
                            System.out.println("Erro [InvocationTargetException]: " + e.getMessage());
                        }
                    }
                    contador++;
                }
            }
        }
        return retorno;
    }

    @Override
    public void setValueAt(Object oValor, int linha, int coluna) {
        if (!this.valores.isEmpty()) {
            int contador = 0;
            T umObjeto = this.valores.get(linha);

            Method listaMetodos[] = umObjeto.getClass().getMethods();
            for (Method umMetodo : listaMetodos){
                if (!umMetodo.getName().startsWith("get"))
                    continue;

                if (umMetodo.isAnnotationPresent(Relacao.class)){
                    if (contador == coluna){
                        try {
                            String nomeMetodoSet = "set" + umMetodo.getName().substring(3);
                            Method metodoSet = umObjeto.getClass().getMethod(nomeMetodoSet,umMetodo.getReturnType());
                            metodoSet.invoke(umObjeto, oValor);                            
                        } catch (NoSuchMethodException e){
                            System.out.println("Erro [NoSuchMethodException]: " + e.getMessage());
                        } catch (IllegalAccessException e){
                            System.out.println("Erro [IllegalAccessException]: " + e.getMessage());
                        } catch (InvocationTargetException e){
                            System.out.println("Erro [InvocationTargetException]: " + e.getMessage());
                        }
                    }
                    contador++;
                }
            }
        }
    }

    @Override
    public Class<?> getColumnClass(int coluna) {
        Class retorno = null;
        if (!this.valores.isEmpty()) {
            T umObjeto = this.valores.get(0);
            Method listaMetodos[] = umObjeto.getClass().getMethods();
            int contador = 0;
            for (Method umMetodo : listaMetodos){
                if (!umMetodo.getName().startsWith("get"))
                    continue;

                if (umMetodo.isAnnotationPresent(Relacao.class)){
                    if (contador == coluna){
                          retorno = umMetodo.getReturnType();
                    }
                    contador++;
                }
            }
        }
        return retorno;
    }
    
    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex) {
        return false;
    }

    public T get(int row) {
        return valores.get(row);
    }
}

4 Respostas

Marky.Vasconcelos

Bem… a ideia é bem parecida com o ObjectTableModel que criei.

Mas falando do seu código, acredito que voce possa refatorar a aprte do getValueAt. Pois toda hora voce precisa percorrer todos os métodos para ficar pegando o valor.

kenneth

Falae Marky…
Eu ja tinha visto a sua assinatura, mas nao tinha me atentado ao ObjectTableModel…

Farei isso
=]

E obrigado pela opiniao…

Abraco!

ViniGodoy

Dá uma boa estudada nesse TableModel do Mark. É realmente muito próximo do que você quer fazer…

Aí quem sabe os dois não trabalham juntos em melhorias. :slight_smile:

kenneth

Tranquilo…
=]
Aqui no trampo nao consigo acessar o blog, mas em casa, do uma boa olhada.

Valeu!

Criado 5 de agosto de 2010
Ultima resposta 5 de ago. de 2010
Respostas 4
Participantes 3