Atualizando JTable

4 respostas
M

Ola Pessoal.

Estou com uma aplicacao JDialog com um JTable e um botao “Incluir”, o botao chama uma segunda JDialog com um cadastro, quando eu faco o cadastro a janela se fecha o insert no banco e feito, mas a JTable naum e atualizada…

Bom eu sei q eu tenho q implementar a inteface TableModelListener, mas eu to conseguindo ententer como fazer isso… ja dei uma olhada em uma classe exemplo da Sun.

segue abaixo:

/** 
 * In a chain of data manipulators some behaviour is common. TableMap
 * provides most of this behavour and can be subclassed by filters
 * that only need to override a handful of specific methods. TableMap 
 * implements TableModel by routing all requests to its model, and
 * TableModelListener by routing all events to its listeners. Inserting 
 * a TableMap which has not been subclassed into a chain of table filters 
 * should have no effect.
 *
 * @version 1.4 12/17/97
 * @author Philip Milne */

import javax.swing.table.*; 
import javax.swing.event.TableModelListener; 
import javax.swing.event.TableModelEvent; 

public class TableMap extends AbstractTableModel implements TableModelListener
{
    protected TableModel model; 

    public TableModel  getModel() {
        return model;
    }

    public void  setModel(TableModel model) {
        this.model = model; 
        model.addTableModelListener(this); 
    }

    // By default, Implement TableModel by forwarding all messages 
    // to the model. 

    public Object getValueAt(int aRow, int aColumn) {
        return model.getValueAt(aRow, aColumn); 
    }
        
    public void setValueAt(Object aValue, int aRow, int aColumn) {
        model.setValueAt(aValue, aRow, aColumn); 
    }

    public int getRowCount() {
        return (model == null) ? 0 : model.getRowCount(); 
    }

    public int getColumnCount() {
        return (model == null) ? 0 : model.getColumnCount(); 
    }
        
    public String getColumnName(int aColumn) {
        return model.getColumnName(aColumn); 
    }

    public Class getColumnClass(int aColumn) {
        return model.getColumnClass(aColumn); 
    }
        
    public boolean isCellEditable(int row, int column) { 
         return model.isCellEditable(row, column); 
    }
//
// Implementation of the TableModelListener interface, 
//

    // By default forward all events to all the listeners. 
    public void tableChanged(TableModelEvent e) {
        fireTableChanged(e);
    }
}

Ai vai as minhas duvidas:

1º duvida:

protected TableModel model;   
   
     public TableModel  getModel() {  
         return model;  
     }  
   
     public void  setModel(TableModel model) {  
         this.model = model;   
         model.addTableModelListener(this);   
     }

eu naum estou entendo essa parte… eu ja naum estou criando um modelo na classe, pq eu preciso receber outro.

2º Duvida

// By default forward all events to all the listeners.   
     public void tableChanged(TableModelEvent e) {  
         fireTableChanged(e);  
     }

eu naum estou entendendo esse metodo… como ele faz essa atualizacao… ele faz uma nova consulta no banco?

Bom pessoal ficou um pouco grande mas acho q da para entender… :thumbup:
Falow.
agradeco desde Já.

4 Respostas

M

E ae tudo bem? Que acha de um método só para atualizar a tabela?
Na sua classe DAO:

public List lista() {
        ArrayList lista = new ArrayList();        
        Pessoa pessoa = null;        
        try {
            String sql = "select * from PESSOA order by NOME";            
            Connection c = Conexao.getConexao();
            Statement st = c.createStatement();
            ResultSet rs = st.executeQuery(sql);
            
            while ( rs.next() ) {
                pessoa = new Pessoa();
                pessoa.setIdPessoa( rs.getInt( "ID" ) );
                pessoa.setBairro(rs.getString("NOME"));
                pessoa.setCep(rs.getString("ENDERECO"));
                lista.add( pessoa );
            }
        }catch ( SQLException e ) {
            ...
        }catch( Exception e ) {
             ...
        } finally {
           try {
              if(rs !=null) rs.close();
              if(st !=null) rs.close();
              if(c !=null) rs.close();

           } catch(Excepetion e) {
              ...
           }
        }
        return lista;
    }

    public Object[][] listaArray() {
        List lista = lista();
        Object[][] arrayDados = new Object[lista.size()][27];
        Iterator i = lista.iterator();
        int cont = 0;
        while( i.hasNext() ) {
            Pessoa p = ( Pessoa ) i.next();
            arrayDados[cont][0] = p.getIdPessoa();
            arrayDados[cont][1] = p.getNome();
            arrayDados[cont][2] = p.getEndereco();
            cont++;
        }
        return arrayDados;
    }
    // as colunas da tabela 
    public String[] getColunas() {
        String [] colunas = {"Código",
        "Nome",
        "Endereço",
    }

E lá na sua classe visual você cria e chama esse método qdo finalizar um cadastro:

private void atualizaTabela() { Object[][] arrayDados = dados.listaArray(); // dados é um objeto DAO (use composição) String[] arrayColunas = dados.getColunas(); TableModel modelo = new DefaultTableModel(arrayDados, arrayColunas){ public boolean isCellEditable(int row, int column) { return false; } }; tabela.setModel(modelo);

Abraços…

lina

Oi,

simplesmente sua tabela necessita de uma atualização.
Provavelmente os dados estão inserindo corretamente, basta dar um “repaint” na tabela.

Tchauzin

M

Faça novamente a inserção dos dados, como da primeira vez!!!

lsouzabr

mfjeng

Valeu o exemplo mano, segui seus passos por aqui e deu certinho!!!

Obrigado!

Criado 16 de novembro de 2007
Ultima resposta 13 de dez. de 2008
Respostas 4
Participantes 5