[RESOLVIDO] AbstractTableModel generica

10 respostas
L

Olá pessoal,

implementei uma classe que herda AbstractTableModel e implementei os metodos necessários. Como minha classe é generica eu recebo uma lista generica:

private List<?> lista;

private Class<?> classe;

public ReflectionTableModel(List<?> lista, Class<?> classe) {
	this.lista = lista;
	this.classe = classe;
}

Esse é o método que adiciona mais itens:

public void adicionaItem(){
        int linha = lista.size()-1;
        fireTableRowsInserted(linha,linha);
    }

O problema é quando eu quero inserir mais um item na lista, por ela ser generica eu não consigo adicionar.

Alguém tem alguma idéia pra isso?

Obrigado!

10 Respostas

Marky.Vasconcelos

Ué… seu método adicionaItem não recebe nenhum item como parametro?

Mostra toda sua implementação do Model.

L

Segue a classe:

public class ReflectionTableModel extends AbstractTableModel {

	private List<?> lista;

	private Class<?> classe;

	public ReflectionTableModel(List<?> lista, Class<?> classe) {
		this.lista = lista;
		this.classe = classe;
	}

	@Override
	public int getColumnCount() {
		int colunas = 0;
		for (Method method : classe.getDeclaredMethods()) {
			if (method.isAnnotationPresent(Coluna.class)) {
				colunas++;
			}
		}
		return colunas;
	}

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

	@Override
	public Object getValueAt(int rowIndex, int columnIndex) {
		try {
			Object object = lista.get(rowIndex);
			for (Method method : classe.getDeclaredMethods()) {
				Coluna c = method.getAnnotation(Coluna.class);
				if (c != null && c.posicao() == columnIndex) {
					return method.invoke(object);
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

    @Override
    public String getColumnName(int column) {
        for(Method method : classe.getDeclaredMethods()){
            Coluna c = method.getAnnotation(Coluna.class);
            if(c != null && c.posicao() == column){
                return c.titulo();
            }
        }
        return "";
    }

    public void adicionaItem(){
        int linha = lista.size()-1;
        fireTableRowsInserted(linha,linha);
    }

    public Object carregaItem(int row){
        return lista.get(row);
    }

    public void deleteItem(int row){
        fireTableRowsDeleted(row, row);
        lista.remove(row);
    }
}
ViniGodoy

Não era melhor fazer um ReflectionTableModel<T> ?

Assim seu método carregaItem poderia retornar o tipo específico, ao invés de Object.

Marky.Vasconcelos

Sim, e seu método adicionaItem deveria receber um item para poder adicionar na lista não acha?

Algo como (E aproveitando dica de generic do Vini)

public void adicionaItem(T item){
list.add(item);
int linha = lista.size()-1;   
fireTableRowsInserted(linha,linha);  
}

E seu método carregaItem seria assim.

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

E volto a dizer, voce deveria melhorar a lógica do getValueAt.

L

Verdade pessoal, foi vacilo meu… não pensei nisso…

Obrigado pela força!

Leonardo

L

Pessoal, só mais uma dúvida, eu atualizo os dados e a tabela só é atualizada quando eu tiro o foco da linha.

Não deveria atualizar automaticamente?

Marky.Vasconcelos

Como assim? Não entendi sua duvida.

L

Quando eu modifico o objeto da linha 4 por exemplo, a alteração só aparece quando eu mudo o foco de linha.

B

Ah, é que para alguma coisa se refletir na tabela, é necessário dar um fireTableRowsUpdated nessa tal linha.

http://download.oracle.com/javase/1.4.2/docs/api/javax/swing/table/AbstractTableModel.html#fireTableRowsUpdated(int,%20int)

L

Funcionou perfeito, valeu!!!

Criado 9 de agosto de 2010
Ultima resposta 9 de ago. de 2010
Respostas 10
Participantes 4