Criar parametros para o meu TableModel

2 respostas
furacao123

Aew galera to com uma duvida com eu crio parametros para o meu TableModel:

package TableModels;

import javax.swing.table.AbstractTableModel;

public class ModeloHorarioEditavel extends AbstractTableModel {


        private String[] ColunasTabela = {"Nome", "Ent.1", "Sai.1", "Ent.2", "Sai.2", "Ent.3", "Sai.3", "Ent.4", "Sai.4"};
       
        private Object[][] dados = {};

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

        public int getRowCount() {
            return dados.length;
        }

        public String getColumnName(int col) {
            return ColunasTabela[col];
        }

        public Object getValueAt(int row, int col) {
            return dados[row][col];
        }
 
        public Class getColumnClass(int c) {
            return getValueAt(0, c).getClass();
        }
   
        public boolean isCellEditable(int row, int col) {
            //Note that the dados/cell address is constant,
            //no matter where the cell appears onscreen.
            if (col < 10) {
                return false;
            } else {
                return true;
            }
        }   
}

onde eu vou usar quero fazer igual ao DefaultTableModel quando eu uso o setModel(); me da as diferentes opçoes de parametros

no meu caso precisaria que meu modelo recebece o vetor pra popular a tabela pois ela eh dinamica muda toda hora como faço isso tentei criar um construtor mas da erro

2 Respostas

javer

Primeira coisa, eu aconselho você a usar um ArrayList ao invés de um Vector para carregar uma coleção no modelo.

Segunda coisa, você pode criar um método para adicionar/setar essa coleção no modelo.

Vou dar um exemplo:

// no inicio da classe
ArrayList<Pessoa> lista;

public void setLista(ArrayList<Pessoa> lista){
   this.lita = lista;
}

Agora na classe onde está a tabela com o modelo:

// Colocar o modelo na sua tabela
ModeloHorarioEditavel modelo = new ModeloHorarioEditavel();
suaTabela.setModel(model);
...
// Agora setando a nova colecao
ArrayList<Pessoa> lista = ALGUMA_COISA_QUE_TRAGA_A_LISTA;

((ModeloHorarioEditavel)suaTabela.getModel()).setLista(lista);
ViniGodoy

O seu TableModel é uma classe como outra qualquer. Você pode criar o método set que quiser.

javer, faltou disparar o evento dizendo que os dados da tabela mudaram no seu set:

// no inicio da classe
List&lt;Pessoa&gt; lista = new ArrayList&lt;Pessoa&gt;();

public void setLista(List&lt;Pessoa&gt; lista){
   this.lista = new ArrayList&lt;Pessoa&gt;(lista);
   //Precisamos avisar a tabela que os dados mudaram e que ela precisa ser redesenhada
   fireTableDataChanged(); 
}

Também prefira criar as variáveis de coleção com o tipo da interface, não da classe concreta (List, no caso, ao invés de ArrayList direto). Isso permite substituir facilmente o tipo de lista.

Note também que estou fazendo uma cópia do ArrayList dentro do TableModel. Caso contrário, seria uma violação grave do encapsulamento da classe do TableModel e permitira, por exemplo, que seu usuário inserisse dados na lista de maneira arbitrária, sem que o model e o JTable tomassem conhecimento. O ideal, no caso de um model, seria criar também um método:

public void add(Pessoa pessoa) {
   lista.add(pessoa);
   fireTableRowsAdded(lista.size(), lista.size());
}

Você pode ver um exemplo de TableModel bastante inteligente aqui:
http://www.guj.com.br/posts/list/100793.java

Criado 9 de janeiro de 2009
Ultima resposta 16 de jan. de 2009
Respostas 2
Participantes 3