Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Andrey Knupp Vital

[Resolvido] JTable, e os Listeners ..

Recommended Posts

Galera, eu tenho uma dúvida /problema em relação ao Listener e o objeto recebido por ele, que é adicionado quando um valor é alterado na tabela, enfim ..

 

Vendo o seguinte código:

package customers;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import view.CustomersList;

public class Customers {

      public static void main(String[] args) throws SQLException {
             DefaultTableModel model = new DefaultTableModel();
             model.addColumn("Código");
             model.addColumn("Nome");
             model.addColumn("Sobrenome");
             while (result.next()) {
                    model.addRow (
                            new Object[]{
                                   result.getString("codigo"),
                                   result.getString("nome"),
                                   result.getString("sobrenome")
                            }
                   );
             }

             model.addTableModelListener(new TableListener());
             CustomersList lista = new CustomersList();
             final JTable table = lista.getTable();
             table.setModel(model);
             table.setColumnSelectionAllowed(false);
             lista.setVisible(true);
      }

}

 

Eu crio meu table model, e adiciono um Listener pra quando um valor for alterado, esse listener seja chamado, então ..

 

package application;

import java.util.Arrays;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.TableModel;

class TableListener implements TableModelListener {

      @Override
      public void tableChanged(TableModelEvent e) {
             if ( e.getType() == TableModelEvent.UPDATE ) {
                    System.out.println("Updating ...\n");
                    TableModel model = (TableModel)e.getSource();
                    String columnName = model.getColumnName(e.getColumn());
                    Object data = model.getValueAt(e.getFirstRow(), e.getColumn());
                    System.out.println(Arrays.asList(data));
             }
      }


}

 

Funcionando normalmente, só que ... pra eu montar a query de UPDATE e/ou DELETE, eu preciso de um identificador, que no caso seria a coluna código, o problema: o listener esta pegando DEPOIS da alteração .. alguma idéia pra pegar o código ANTES dessa linha ser alterada e montar o update utilizando o WHERE codigo ...

 

A Documentação do Java é péssima, não achei muita coisa que me fosse util, e a maioria dos exemplos que vi é superficial em partes, daí fica difícil achar algo sobre..

 

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu entendi seu problema e confesso que não sei a solução. Entretanto, não seria uma opção viável deixar a coluna de código não editável? Na minha opinião o ideal seria ter uma coluna de código invisível. Lembro que já precisei implementar um evento quando o modelo da tabela era alterado e ao invés de usar TableModelListener usei PropertyChangeListener para a propriedade "model". Mas creio que seja a mesma coisa.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pois é, depois de muita pesquisa, acabou que achei uma TableCellListener, que no caso é uma implementação do PropertyListener ...

 

lista.getTable().addPropertyChangeListener(new PropertyChangeListener() {
     @Override
     public void propertyChange(PropertyChangeEvent evt) {

     }
});

Compartilhar este post


Link para o post
Compartilhar em outros sites

É só uma ideia. Mas será que se você implementasse o seu próprio TableModel juntamente com o padrão de projeto Observer não daria certo? Com o padrão Observer você teria um objeto observável e um ou mais observadores. Assim você teria o seu TableModel observável e no momento em que tentassem alterar o dado do modelo você seria capaz de pegar o valor antigo e o novo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.