Classe TableModel

1 resposta
M

Boa noite a todos. Criei uma classe GenericTableModel para usar em meus formulários de pesquisa. A variável deve ser declarada em uma classe modelo (FrameConsulta), essa classe modelo é a que uso como base para criação dos formulários (FrameConsultaCliente, FrameConsultaFornecedor ... por exemplo). Só que ao declarar a variável no frame base, não posso definir o tipo, pois o mesmo será definido somente na classe filha. Exemplo, na classe FrameConsultaCliente vou dar o new assim: new GenericTableModel(new String[] {"Nome", "CPF"}). O meu problema é que na classe filha não tenho acesso a lista sem fazer um cast: o método getRow que deveria retornar um objeto Cliente retorna um Object. Verifiquei que isso não ocorre se eu declarar o GenericTableModel na classe filha cliente como GenericTableModel tableModel (na classe base declaro como GenericTableModel tableModel). Tem como resolver isso declarando a variável na classe base sem ter que fazer cast?

Essa é minha classe GenericTableModel:
public abstract class GenericTableModel<T> extends AbstractTableModel {
    ArrayList<T> rows;
    String[] columnNames;

    public GenericTableModel(String[] columnNames) {
        this.columnNames = columnNames;
    }

    public GenericTableModel(ArrayList<T> rows, String[] columnNames) {
        this.columnNames = columnNames;
        rows = new ArrayList<T>();
        rows.addAll(rows);
    }

    public void addRows(ArrayList<T> rows) {
        getRows().addAll(rows);
    }

    public ArrayList<T> getRows() {
        if (rows == null) {
            rows = new ArrayList<T>();
        }

        return rows;
    }

    public T getRow(int rowIndex) {
        return getRows().get(rowIndex);
    }

    public void setColumnNames(String[] columnNames) {
        this.columnNames = columnNames;
    }

    public String[] getColumnNames() {
        if (columnNames == null) {
            columnNames = new String[0];
        }

        return columnNames;
    }

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

    public int getColumnCount() {
        return getColumnNames().length;
    }

    public abstract Object getValueAt(int rowIndex, int columnIndex);
}

1 Resposta

Marky.Vasconcelos

Primeiro, voce muda para:

public abstract T getValueAt(int rowIndex, int columnIndex);

Então, na subclasse voce faz o seguinte.

public class PessoaTableModel extends GenericTableModel<Pessoa>{

Dai voce pode implementar esse método retornando Pessoa invés de Object.

Criado 22 de setembro de 2010
Ultima resposta 22 de set. de 2010
Respostas 1
Participantes 2