[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

M

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);
    }
}
V

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

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

M

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?

M

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