Atualizar jTable o inserir registro no banco

Ola a todos, estou com um probleminha aqui, criei uma jTable para mostrar os dados no banco, ele mostra tudo certinho, porém quando vou inserir um novo registro ele não atualiza o table, para que isso acontece eu tenho que fechar a tela e abri-la de novo, ja tentei usar fireTableDataChanged e o repaint e nenhum dos dois funcionou, continua o mesmo problema.

public class ProgramaHistoricoTableModel extends AbstractTableModel {  
	private static final long serialVersionUID = 1L;

	private List<ProgramaHistorico> pHistorico;

	public ProgramaHistoricoTableModel() {
		// no construtor, instanciamos o List
		pHistorico  = new ArrayList<ProgramaHistorico>();
	}

	
	public ProgramaHistoricoTableModel(List<ProgramaHistorico> lista) {
		this();
		pHistorico.addAll(lista);
	}

	@Override
	public Class<?> getColumnClass(int coluna) {
		return String.class;
	}

	public int getColumnCount() {
		return 5;
	}

	@Override
	public String getColumnName(int coluna) {
		switch (coluna) {
		case 0:
			return "ProgId"; 
		case 1:
			return "IdHistórico";
		case 2:
			return "Data"; 
		case 3:
			return "Hora"; 
		case 4:
			return "Programador"; 
		
		default:
			return ""; 
		}
	}

	public int getRowCount() {
		return pHistorico.size();
	}

	public Object getValueAt(int linha, int coluna) {
		ProgramaHistorico ph = (ProgramaHistorico)pHistorico.get(linha);
		switch (coluna) {
		case 0:
			return ph.getProgId(); 
		case 1:
			return ph.getIdprogramahistorico();
		case 2:
			return ph.getData(); 
		case 3:
			return ph.getHora(); 
		case 4:
			return ph.getProgramador(); 
		default:
			return null; 
		}
	}

	@Override
	public boolean isCellEditable(int rowIndex, int columnIndex) {
		return false;
	}

	
	public void setValueAt(ProgramaHistorico valor) {
		ProgramaHistorico c = new ProgramaHistorico();
		if (pHistorico.size() != 0){
			c = pHistorico.get(pHistorico.size() + 1);
		}	
		for (int i = 0; i < 4; i++) {
			switch (i) {
			case 0:
				c.setProgId(valor.getProgId()); 
				break;
			case 1:
				c.setProgId(valor.getProgId());
				break;
			case 2:
				c.setProgId(valor.getProgId());
				break;
			case 3:
				c.setProgId(valor.getProgId());
				break;
			}
		}
		fireTableDataChanged();
	}

	
	public void adiciona(ProgramaHistorico ph) {
		pHistorico.add(ph);
		fireTableRowsInserted(pHistorico.size() - 1, pHistorico.size() - 1);
	}

	public void remove(int indice) {
		pHistorico.remove(indice);
		fireTableRowsDeleted(indice, indice);
	}

	
	public int getIndice(Programa c) {
		return pHistorico.indexOf(c);
	}

	
	public void adicionaLista(List<ProgramaHistorico> lista) {
		int i = pHistorico.size();
		pHistorico.addAll(lista);
		fireTableRowsInserted(i, i + lista.size());
	}

	public void limpaLista() {
		int i = pHistorico.size();
		pHistorico.clear();
		fireTableRowsDeleted(0, i - 1);
	}
	
	

}

método que substituiria o table

public void refreshTable(){
		//jtable.repaint();
		model.fireTableDataChanged();
		jtable.repaint();
		JPanelSEProgramas tab = new JPanelSEProgramas();
		tab.instanciaComponentes();
		
	}

desde ja agradeço…até mais

.

Mas voce adicionou o novo objeto no model?

O que seria isso? Só para subir o post? …
Eu axo que tá faltando vc adicionar o novo objeto no model…
Bom ver que usuários estão dexando o default table model pra lá =)

Huahua… depois de tanta gente reclamando do DefaultTableModel o povo realmente ta parando. É tipo um virus, estamos infectando a idéia.

Podíamos parar um tempo…
Assim eles sofrem um pouco mais, e talvez desistam da área, dando mais oportunidades pra gente! kkkkk
(Zuera ;D)

Posta o código onde você faz a inclusão do novo objeto.
O método refreshTable() é inútil. Pode apaga-lo.

Cria um método para preencher o jtable e depois é só chamar caso a gravação do registro ser concluída com sucesso!!

aqui eu chamo o método refreshTable que irá setar os valores do objeto

}else {
		dao.createHistorico(prog);
		seProg.refreshTable(prog);
		                				
}

no refresh viou chamar o setValueAte passar o objeto atualizado como parametro

public void refreshTable(ProgramaHistorico prog){
		model.setValueAt(prog);
		model.fireTableDataChanged();
		jtable.repaint();
		
	}

e aqui eu seto os valores…só que a tabela continua a mesma…


public void setValueAt(ProgramaHistorico prog) {
		ProgramaHistorico c = new ProgramaHistorico();
		if (pHistorico.size() != 0){
			c = pHistorico.get(pHistorico.size() + 1);
		}	
		for (int i = 0; i < 4; i++) {
			switch (i) {
			case 0:
				c.setProgId(prog.getProgId()); 
				break;
			case 1:
				c.setIdprogramahistorico(prog.getIdprogramahistorico());
				break;
			case 2:
				c.setProgramador(prog.getProgramador());
				break;
			case 3:
				c.setDescricao(prog.getDescricao());
			case 4:
				c.setData(prog.getData());
			case 5:
				c.setHora(prog.getHora());
				break;
			}
		}
		fireTableDataChanged();
	}

eu não consigo entender aonde deveria ser chamado o método setValueAt e onde que eu iria iniciar esses parâmetros, “Valor”, “linha” e “coluna”

Não entendi. Você cria um novo objeto e não chama o método adiciona do seu model? Pq vc está chamando o setValueAt?

Para que algo a mais pareça no seu JTable, você deve chamar o método adiciona! Ele é que vai incluir o método na lista interna do model e avisar a table que tem um objeto a mais por lá.

sim eu alterei aqui e passei a chamar o método adiciona e passo o objeto com os dados a serem adicionados

	model.adiciona(prog);

porém ao debugar o método adicionar percebi que meu List “pHistorico” que deveria conter os outros registro ja existentes esta vazio… pode ser isso?

public void adiciona(ProgramaHistorico ph) {
		pHistorico.add(ph);
		fireTableRowsInserted(pHistorico.size() - 1, pHistorico.size() - 1);
	}

depois do adiciona é preciso chamar outro metodo pa atualizar a Table?

Com certeza pode ser isso.

Não, mais nada.

pois é…tentei alimentar a lista de novo mais mesmo assim não teve geito…to perdendo as esperanças ja

=/

Acho que o primeiro passo é descobrir pq a tua lista tá vazia, se devia estar cheia.

Pode postar o código que usa esse model? O da interface gráfica?

o método refreh eu chamo em outra janela…


private JButton getJButtonOk() {
		if (jButtonOk == null) {
			jButtonOk = new JButton();
			jButtonOk.setRequestFocusEnabled(false);
			jButtonOk.setBounds(87, 213, 105, 26);
			jButtonOk.setText("   Ok       ");
			jButtonOk.setIcon(new ImageIcon("C:/ISHistorico/images/icons/20x20/Save.gif"));
			jButtonOk.addActionListener(new java.awt.event.ActionListener() { 
				public void actionPerformed(java.awt.event.ActionEvent e) {    
					 try {
						 	JPanelSEProgramas seProg = new JPanelSEProgramas();
						 	prog = new ProgramaHistorico();
		                	ProgramasDaoImpl<ProgramaHistorico> dao = new ProgramasDaoImpl<ProgramaHistorico>();
		                			prog.setProgId(progid); 
		                			prog.setDescricao(jEditorTextAreaDescricao.getText());
		                			prog.setProgramador(jMaxLenTextFieldProgramador.getText());
		                			prog.setData((GregorianCalendar)jDateTextFieldData.getDate());
		                			prog.setHora(jHHMMTextFieldHoraAtend.getText());
		                			if (alterar){
		                				dao.updateHistorico(prog);
		                			}else {
		                				dao.createHistorico(prog);
		                				seProg.refreshTable(prog);
		                				
		                			}
		                			limpar();
		                }
		                catch (Exception ei){
		                	ei.printStackTrace();
		                }
				}
			});
		}
		return jButtonOk;
	}

e é nele que eu chamo o adicionar


public  JScrollPane instanciaComponentes() { 
		model = new ProgramaHistoricoTableModel();
		model.addTableModelListener(this);
		model.adicionaLista(ProgramasDaoImpl.listarHistoricosProgramas(progId));
		jtable = new JTable();
		jtable.setModel(model);
		scrollPane = new JScrollPane();
		scrollPane.setViewportView(jtable);
		
		jtable.setSize(new Dimension(241, 101));
		scrollPane.setBounds(4, 111, 616, 413);
		
		return scrollPane;
		
	}
	
	public void refreshTable(ProgramaHistorico prog){
		model.adiciona(prog,prog.getProgId());
		instanciaComponentes();
		jtable.repaint();
		
	}

ele não acusa erro nenhum, simplesmente a tabela num sofre alteração nenhuma

nda?

não conseguiu nda ViniGodoy ?

Posta todo o código que usa o model. O conteúdo do seu ArrayList não pode estar simplesmente desaparecendo.