Jtable e JPA - Celula onde estou digitando quando mando persistir é salva com valor null

1 resposta
claupers

Olá.
Já fiz buscas no google mas não consegui encontrar nada para esclarecer essa minha duvida.
Implementei um AbstracTableModel. Tudo funciona corretamente. O problema está com a celula que estou digitando no momento em que mando persistir na base. Ela e salva como null.
Se eu clicar em outra célula antes antes de salvar ai o valor é salvo corretamente.
O Código do meu AbstractTableModel é o seguinte:

package br.com.claupers.model;

import java.util.ArrayList;
import java.util.List;

import javax.swing.table.AbstractTableModel;

public class FoneTableModel extends AbstractTableModel {
	
	List<TbFone> lista; 
	
	public FoneTableModel(){
		this.lista = new ArrayList<TbFone>();
		
	}
	
	public FoneTableModel(List<TbFone> c){
		this();
		lista.addAll(c);
		
	}
	
	public void addAll(List<TbFone> c){
		lista.clear();
		lista.addAll(c);
		fireTableDataChanged();
		
	}
	
	public void add(TbFone e){
		lista.add(e);
		fireTableRowsInserted(lista.size(), lista.size());		
	}
	
	@Override
	public int getColumnCount() {
		// TODO Auto-generated method stub
		return 4;
	}

	@Override
	public int getRowCount() {
		// TODO Auto-generated method stub
		return lista.size();
	}

	@Override
	public Object getValueAt(int row, int col) {
		TbFone f = lista.get(row);
		if (col==0){
			return f.getFoneCod();
		}else if (col==1){
			return f.getTbContato();
		}else if (col==2){
			return f.getFoneNumero();
		}else if (col==3){
			return f.getFoneTipo();
		}
		return "Vazio";
		
		
	}

	@Override
	public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
		TbFone f = lista.get(rowIndex);
		if (columnIndex==0){
			f.setFoneCod(Integer.parseInt(aValue.toString()));
		}else if (columnIndex==1){
			f.setTbContato((TbContato)aValue);
		}else if (columnIndex==2){
			f.setFoneNumero(aValue.toString());
		}else if (columnIndex==3){
			f.setFoneTipo(aValue.toString());
		}
		fireTableCellUpdated(rowIndex, columnIndex);
	}

	@Override
	public String getColumnName(int column) {
		if (column==0){
			return "ID";
		}else if (column ==1){
				return "ID Cont";
		}else if(column==2) {
				return "Numero";
		}else if (column==3){
				return "Tipo";			
		}
		return super.getColumnName(column);
	}

	
	
	@Override
	public boolean isCellEditable(int rowIndex, int columnIndex) {
		// TODO Auto-generated method stub
		return true;
	}

	public void remove(int index){
		lista.remove(index);
		fireTableDataChanged();
	}
	public void remove(TbFone fone){
		lista.remove(fone);
		fireTableDataChanged();
	}	

	@Override
	public Class<?> getColumnClass(int columnIndex) {
		// TODO Auto-generated method stub
		return Object.class;
	}

	@Override
	public void fireTableCellUpdated(int row, int column) {
		// TODO Auto-generated method stub
		super.fireTableCellUpdated(row, column);
	}
	
}

Alguém sabe como resolver isso?

1 Resposta

claupers

Problema resolvido. Em uma depuração percebi que o problema era com o metodo setValueAt que é chamado apenas quando a celula perde o foco. Então durante buscas pelo setValueAt encontrei a seguinte solução. Ao criar a jTable adicionar a seguinte linha:

nomeDaJTable.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);

Dessa forma, quando a tabela perde o foco ela termina a edição, com isso o setValueAt é chamado e a informação gravada na lista que pode ser persistida sem problemas.
Pelo que vi existe outros métodos, mas esse foi o suficiente.

Links das referências a solução:


Criado 17 de maio de 2011
Ultima resposta 17 de mai. de 2011
Respostas 1
Participantes 1