JInternalFrame e JTable MDI[Resolvido]

Estou desenvolvendo uma aplicação tipo MDI onde tenho uma Jtable dentro de um JInternalFrame, essa tabela mostra uma lista de funcionarios salvos em um banco MySQL. Tambem nesse JInternalFrame tenho JButtons para adicionar, excluir, alterar e pesquisar informações dessa tabela. Quando eu clico em incluir, me abre outro JInternalFrame para fazer essa inclusão no banco de dados. Mas ao finalizar essa operação as informações só são salvas no banco, mas não aparecem na tabela ate que eu feche o JInternalFrame e abra ele novamente. Ja tentei atualizar de varios modos mas ainda não funcionou. Segue o meu codigo:

//1º JInternalFrame chamado ListaFuncionarios //Metodo que preenche a JTable public void preencheTabela(DefaultTableModel modelo) { try { FuncionarioDAO dao = new FuncionarioDAO(); dao.conecta(); dao.consulta(); ResultSet temp = dao.getResultado(); while (temp.next()) { String[] row = { temp.getString("nome"), temp.getString("endereco"), temp.getString("cpf"), temp.getString("rg") }; modelo.insertRow(0, row); } } catch (Exception e) { e.printStackTrace(); } }

Aqui uma das muitas tentativas de Atualizar

public void InsereLinha(Funcionario f) { String cpf2 = Integer.toString(f.getCpf()); String rg2 = Integer.toString(f.getRg()); String[] row = { f.getNome(), f.getEndereco(), cpf2, rg2 }; modelo.addRow(row); }

E aqui é o JInternalFrame que Insere

[code]
//2º JInternalFrame chamado InsereFuncionario
public Funcionario RecuperaFuncionario() {
String nome = txtNome.getText();
String end = txtEnd.getText();
String cpf = txtCpf.getText();
int cpf2 = Integer.parseInt(cpf);
String rg = txtRg.getText();
int rg2 = Integer.parseInt(rg);
String usuario = txtUsuario.getText();
String senha = txtSenha.getText();
Funcionario funcionario = new Funcionario(nome, end, cpf2, rg2,
usuario, senha);
return funcionario;
}

public class ButtonHandler implements ActionListener {
	public void actionPerformed(ActionEvent ae) {
		if (ae.getSource() == btnSalvar) {
			FuncionarioDAO dao = new FuncionarioDAO();
			dao.conecta();
			try {
				dao.adiciona(RecuperaFuncionario());
			} catch (SQLException e) {
				e.printStackTrace();
			}
			JOptionPane.showMessageDialog(null,	"                       Inclusão Efetuada", "Mensagem",	JOptionPane.PLAIN_MESSAGE);
			ListaFuncionario lf = new ListaFuncionario();
			lf.InsereLinha(RecuperaFuncionario());	
			dispose();
		}
		if (ae.getSource() == btnCancelar) {
			dispose();
		}
	}
}[/code]

Onde eu leio os campos do formulario e depois envio o objeto pro metodo adiciona que manda pro banco de dados e depois chamo o metodo InsereLinha do JInternalFrame que esta a minha JTable pra atualizar inserindo esse novo registro, mas nada. Tambem tentei chamar o metodo PreencheTabela mas tambem não deu certo. Alguem já passou por isso antes?? Se alguem puder me dar um help eu ficaria grato pois ja acabaram as minhas ideias. Falou.

Então,

Tu precisa primeiro implementar um Model para a tua JTable. Talvez tu já tenha implementado. Envia esse Model para o teu JInternalFrame de Cadastro, e ao salvar, após a confirmação do Banco de dados, tu pega o novo objeto e insere no Model. No método de inserção é importante que após inserir o objeto, em um list ou vector do model, tu “avise” a table que teve mudanças, com o método fireDataChange() (eu acho que é esse).

Fernando Rosa

Cara eu tb tive um problema parecido, tentei de todas as formas utilizando o DefaultTableModel e nada…

Daí eu, como quem não quer nada, utilizei o metodo setValueAt(Object ob, int x, int y); da JTable e funcionou legal, o que foi dificil foi a questão de criar novas linhas nisso eu acho que vc vai ter um pouco de dificuldade.

:slight_smile:

flwssss

Notifique a view dizendo que o model foi alterad.
Procure no google e no guj por um pattern chamado Observer

Pessoal,

Não precisa nada disso, de observer, etc… Tem que fazer uma classe que estenda AbstractTableModel. Implementa os métodos, cria nessa classe um List, um método addFuncionario que ficaria assim:

public void addElement(Funcionario funcionario){
 listaFuncionario.add(funcionario)
 fireTableDataChanged();
}

esse model, tu define como sendo o model da tabela…e passa esse model para a tela onde tu vai salvar um funcionario. Após salvar, adiciona o funcionário e pronto… a tabela irá se atualizar.

Sobre o DefaultTableModel, eu sempre digo: NUNCA IMPLEMENTE UM MODEL DO TIPO DefaultTableModel. Ele serve apenas para exemplos e demonstração.

att

Fernando rosa

Ai gente, muito obrigado pela ajuda, tentei de tudo o que vcs me aconselharam mas tava dificil. Tentei todo tipo de firexxx(); e nada, procurei sobre Observe e não consegui implementar :oops: ,tentei implementar um modelo proprio pra minha tabela pra não usar o DefaultTableModel, mas tambem não consegui :oops: . Ai eu percebi que toda alteração que eu fazia no meu ultimo JInternalFrame mesmo instanciando o JInternalFrame anterior eu não conseguia alterar nada nele , então eu continuei com o metodo insere linha mas fiz uma pequena alteração mudando ele pra static e mudei tambem o meu modelo pra static ai eu consegui atualizar a tabela ao inserir uma nova linha. Gostaria da opinião de voces quanto ao metodo que utilizei, se teria algum problema ou se seria meio que “gambiarra”. Abraços!!!

Cara Tu poderia criar uma thread.!!!
So pra atualiza tua tabela. Seria melhor no caso de voce nao ter implementado seu proprio TableModel.
Mas é melhor implementar sua propria, como ja foi dito anteriormente
Posta pra avisar se resolveu