[Resolvido]Como saber se algo mudou na JTable?

Estou precisando descobrir se o usuário fez alguma alteração de valor em uma JTable com AsbtractTableModel, pois, ao perceber que algo foi modificado 1 botão da aplicação sera ativado(setEnabled(true)), que será o botão de salvar as alterações, ao qual fará update no BD!

porém não sei como perceber que algo foi modificado para deixar o botão enabled.

Minhas classe de Model está assim:

public class clsTecnicoModel extends AbstractTableModel 
{
   private static final int COL_NOME = 0;
   private static final int COL_CARGO = 1;
   private static final int COL_ESTADO = 2;
   private static final int COL_CIDADE = 3;
   private static final int COL_BAIRRO = 4;
   private static final int COL_RUA = 5;
   private static final int COL_NUMERO = 6;
   private static final int COL_TELEFONE = 7;
   private static final int COL_CELULAR = 8;
   private static final int COL_ADMISSAO = 9;
   private static final int COL_SALARIO = 10;
   private static final int COL_STATUS = 11;

   //Lista de objetos da classe "clsTecnico"
   private List<clsTecnico> valores;

   public clsTecnicoModel(List<clsTecnico> valores)
   {
       this.valores = new ArrayList<clsTecnico>(valores);
   }
   
   public int getRowCount()
   {
       //Qtd. de linhas
       return valores.size();
   }
   
   public int getColumnCount()
   {
       //Qtd. de colunas
       return 12;
   }
   
   @Override
   public String getColumnName(int columnIndex)
   {
       //Nome das colunas
       if (columnIndex == COL_NOME) return "Nome";
       if (columnIndex == COL_CARGO) return "Cargo";
       if (columnIndex == COL_ESTADO) return "Estado";
       if (columnIndex == COL_CIDADE) return "Cidade";
       if (columnIndex == COL_BAIRRO) return "Bairro";
       if (columnIndex == COL_RUA) return "Rua";
       if (columnIndex == COL_NUMERO) return "Número";
       if (columnIndex == COL_TELEFONE) return "Telefone";
       if (columnIndex == COL_CELULAR) return "Celular";
       if (columnIndex == COL_ADMISSAO) return "Admissão";
       if (columnIndex == COL_SALARIO) return "Salário";
       if (columnIndex == COL_STATUS) return "Status";
       return "";
   }

   @Override
   public Object getValueAt(int rowIndex,int columnIndex)
   {
       clsTecnico objTecnico = valores.get(rowIndex);
       //Get de valor
       if (columnIndex == COL_NOME) return objTecnico.getNome();
       if (columnIndex == COL_CARGO) return objTecnico.getCargo();
       if (columnIndex == COL_ESTADO) return objTecnico.getEstado();
       if (columnIndex == COL_CIDADE) return objTecnico.getCidade();
       if (columnIndex == COL_BAIRRO) return objTecnico.getBairro();
       if (columnIndex == COL_RUA) return objTecnico.getRua();
       if (columnIndex == COL_NUMERO) return objTecnico.getNumero();
       if (columnIndex == COL_TELEFONE) return objTecnico.getTelefone();
       if (columnIndex == COL_CELULAR) return objTecnico.getCelular();
       if (columnIndex == COL_ADMISSAO) return objTecnico.getAdmissao();
       if (columnIndex == COL_SALARIO) return objTecnico.getSalario();
       if (columnIndex == COL_STATUS) return objTecnico.getStatus();
       return "";
   }

   @Override
   public void setValueAt(Object aValue, int rowIndex,int columnIndex)
   {
       clsTecnico objTecnico = valores.get(rowIndex);
       //Set de valor
       if (columnIndex == COL_NOME) objTecnico.setNome(aValue.toString());
       if (columnIndex == COL_CARGO) objTecnico.setCargo(aValue.toString());
       if (columnIndex == COL_ESTADO) objTecnico.setEstado(aValue.toString());
       if (columnIndex == COL_CIDADE) objTecnico.setCidade(aValue.toString());
       if (columnIndex == COL_BAIRRO) objTecnico.setBairro(aValue.toString());
       if (columnIndex == COL_RUA) objTecnico.setRua(aValue.toString());
       if (columnIndex == COL_NUMERO) objTecnico.setNumero(aValue.toString());
       if (columnIndex == COL_TELEFONE) objTecnico.setTelefone(aValue.toString());
       if (columnIndex == COL_CELULAR) objTecnico.setCelular(aValue.toString());
       if (columnIndex == COL_SALARIO) objTecnico.setSalario(Double.valueOf(aValue.toString()));
       if (columnIndex == COL_STATUS) objTecnico.setStatus(Integer.valueOf(aValue.toString())); 
   }
   
   @Override
   public Class<?> getColumnClass(int columnIndex)
   {
       return String.class;
   }
   
   @Override
   public boolean isCellEditable(int rowIndex, int columnIndex) 
   {    
       //Permite edição
       return true;   
   }    
   
   public clsTecnico get(int rowIndex) 
   {   
       //Valor da linha inteira
       return valores.get(rowIndex);   
   }
   
}  

Primeiro, dispare um fireTableCellUpdated(int row, int col) no método setValueAt para que o AbstractTableModel dispare eventos para os TableModelListeners.

Segundo, voce coloca um TableModelListener que escute quando a alguma alteração ocorrer e nesse caso voce habilita seu botão.

[quote=Marky.Vasconcelos]Primeiro, dispare um fireTableCellUpdated(int row, int col) no método setValueAt para que o AbstractTableModel dispare eventos para os TableModelListeners.

Segundo, voce coloca um TableModelListener que escute quando a alguma alteração ocorrer e nesse caso voce habilita seu botão.[/quote]

Ok, vou fazer essa chamada deste modo:

public void setValueAt(Object aValue, int rowIndex, int columnIndex) 
{
       clsTecnico objTecnico = valores.get(rowIndex);  
       //Set de valor  
       if (columnIndex == COL_NOME) objTecnico.setNome(aValue.toString());  
       if (columnIndex == COL_CARGO) objTecnico.setCargo(aValue.toString());  
       if (columnIndex == COL_ESTADO) objTecnico.setEstado(aValue.toString());  
       if (columnIndex == COL_CIDADE) objTecnico.setCidade(aValue.toString());  
       if (columnIndex == COL_BAIRRO) objTecnico.setBairro(aValue.toString());  
       if (columnIndex == COL_RUA) objTecnico.setRua(aValue.toString());  
       if (columnIndex == COL_NUMERO) objTecnico.setNumero(aValue.toString());  
       if (columnIndex == COL_TELEFONE) objTecnico.setTelefone(aValue.toString());  
       if (columnIndex == COL_CELULAR) objTecnico.setCelular(aValue.toString());  
       if (columnIndex == COL_SALARIO) objTecnico.setSalario(Double.valueOf(aValue.toString()));  
       if (columnIndex == COL_STATUS) objTecnico.setStatus(Integer.valueOf(aValue.toString()));        
       fireTableCellUpdated(rowIndex, columnINdex);
}

Agora, aonde coloco o Listener ?

Ok, eu fiz o implement do TableModelListener, inseri o Override do tableChanged, e no setValueAt executei o fireTableCellUpdated(rowIndex,columnIndex)

agora, oque faço no tableChanged ? simplesmente executo a ação que eu quero ?

Só falta o TableModelListener, más não faço ideia de como colocar no meu Model, não axo nada na internet…

Voce adiciona o TableModelListener no seu TableModel depois de cria-lo e colocar na JTable.

Então faço uma classe que faz o ‘implement’ do TableModelListener, e adiciono na JTable?

E depois utilizo qual método para chamar no Frame que possuí o JTable para saber que mudou algo?

Segue exemplo (cortado) usando o model para JTables do Towel.

		ObjectTableModel<Person> model = new ObjectTableModel<Person>(
				new AnnotationResolver(Person.class), "name,age,live");
		model.setEditableDefault(true);

		model.add(new Person("A", 10, true));
		model.add(new Person("B", 20, true));
		model.add(new Person("C", 30, false));
		model.add(new Person("D", 40, true));
		model.add(new Person("E", 50, true));
		
		JTable table = new JTable(model);
		JScrollPane pane = new JScrollPane();
		pane.setViewportView(table);
		
		model.addTableModelListener(new TableModelListener() {
			@Override
			public void tableChanged(TableModelEvent e) {
				buttonAlterar.setEnabled(true);
			}
		});

Humm, legal, entendi!

Obrigado pela paciência, rsrsrs…