Recuperar ID de Jtable

Páscoa… época de ressurreição… :smiley:

1 curtida

cara nao concordo… uso defeautTableModel e nunca tive problemas… ela ja contém os métodos nescessários, getSelectedRow, getValueAT, e etc.

realmente nunca tive problema, faço consultas no BD e tenho uma resposta rápida, sem tilts…

e detalhe, uso ela em uma JInternalFrame, integrada… nunca tive problema.

fiz uma aplicação de quase 50 classes, todas abrindo em uma só janela… e tem umas 15 a 25 tabelas, todas como DefeautTableModel…

so q detalhe, nao sei como criar a minha própria TableModel… nao tenho nem idéia, nunca tive nem o interesse em pesquisar como se faz, por isso penso assim, mais

quem sabe… pode ser que essas opções que o VINY GODOY abordou ai pode ser verdade, mais so se me provarem ao contrário…

se eu ver uma tabela que nao seja DefeautTableModel rodando, e eu ver as diferenças…ai sim…

mais se alguem ai souber como faz uma TableModel… posta ai… pode ate esclarecer a dúvida de outros… q por sinal é a minha agora… irei pesquisar por ai como se faz…

valew galera…

Bom, isso explica muita coisa.

Você já consegue criar suas próprias classes de negócio e separa a aplicação em camadas, como rezam as boas práticas de programação?

Ou está rodando selects direto no banco e jogando na tabela, como se fazia lá pelo final dos anos 80?

Se for a primeira opção, acho muitíssimo difícil que você realmente prefira o DefaultTableModel. Também gostaria de saber como você resolveu o problema de, por exemplo, atualizar um registro de um campo, sem exibir seu ID na tabela.

É, eu também gostaria de saber como voce criou essas 15~25 DefaultTableModels para modificar o conteudo da tabela.

Voce criou tudo isso de DAOs só para preencher a tabela?

E a duvida do ViniGodoy ainda é valida

Boa tarde a todos.

Também gostaria de saber como voce recupera uma linha de registros sem fazer o casting :?: Isto é presumindo que voce tenha criado entidade de dados, com um bean por exemplo, passando os dados para o DAO.

Com AbstractTableModel, voce já cria um TableModel, onde o armazenamento do JTable pode ser um dessas entidades de dados, onde ao se clicar na linha de um JTable, ele já retorna essa entidade devidamente populada, é muito melhor do que voce ficar fazendo diversos castings desnecessários.

Além disso, se voce tem uma aplicação que acessa 100 tabelas de um banco, voce vai criar 100 classes DefaultTableModels, como o Marky.Vasconcelos citou.

Aqui na Secretaria, nós temos um Mega Banco de dados que acessa simplesmente 325 tabelas, e consegui criar lista de dados configurando uma classe extendida de AbstractTableModel genérica para todas as 325 tabelas, onde elas são acessadas em único JTable.

correto, eu crio um pacote DAO so para métodos de acessos ao banco, um pacote GETs para armazenar as minhas classes ENTIDADES de GETs and SETTERRS…Encapsulamento e outro pacote, APRESENDAÇÃO, só com as classes de layouts… as que irá aparecer para o usuário…

REEEESUMINDO !!! USO O PADRÃO MVC!!!

e estava programando em SDI, ião se abrindo JANELAS E JANELAS…era janela pra todo lado…

agora estou programando em MDI… fica muuuito mais prático…

e atualizo registro, excluo, altero, tudo passando para outra classe, capturando a linha selecionada… e tambem, nas minhas classes de cadastros de funcionario concursados, terceirizados e etc., os cargos ou salários são listados dentro de uma comboBox apartir de uma consulta em uma tabela específica do BD de acordo para cada cargo.

exemplo…

para eu listar meu funcionário na minha defeautTableModel uso:


public void listarTodos(){
		FuncionarioDAO operac = new FuncionarioDAO();
		ArrayList<FuncionarioGET> lista = operac.consultarTodos();
		
		Object []vec=null; 
		vec = new Object[14];

		for (int i=0; i<lista.size(); i++){ 
			  vec[0]  = ((lista.get(i).getId()));
			  vec[1]  = ((lista.get(i).getNome()));
			  vec[2]  = ((lista.get(i).getCpf()));
			  vec[3]  = ((lista.get(i).getRg()));
			  vec[4]  = ((lista.get(i).getEmail()));
			  vec[5]  = ((lista.get(i).getSexo()));
			  vec[6]  = ((lista.get(i).getEmpresa()));
			  vec[7]  = ((lista.get(i).getSetor()));
			  vec[8]  = ((lista.get(i).getCargo()));
			  vec[9]  = ((lista.get(i).getEstadoCivil()));
			  vec[10] = ((lista.get(i).getSalario()));
			  vec[11] = ((lista.get(i).getLocalizacao()));
			  vec[12] = ((lista.get(i).getEndereco()));
			  vec[13] = ((lista.get(i).getIdade()));	
			  modelo.addRow(vec);
		}
	}

pode nao ser a melhor maneira, mais é so assim que eu sei fazer…

outro exemplo, pra eu alterar uma linha selecionada uso:


	btnAlterar.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent arg0) {
					try {
						jk.setNome((String)tabela1.getValueAt(tabela1.getSelectedRow(),1));
						jk.setCpf((String)tabela1.getValueAt(tabela1.getSelectedRow(),2));
						jk.setRg((String)tabela1.getValueAt(tabela1.getSelectedRow(),3));
						jk.setEmpresa((String)tabela1.getValueAt(tabela1.getSelectedRow(),6));
						jk.setCargo((String)tabela1.getValueAt(tabela1.getSelectedRow(),8));
						jk.setSetor((String)tabela1.getValueAt(tabela1.getSelectedRow(),7));
						jk.setEstadoCivil((String)tabela1.getValueAt(tabela1.getSelectedRow(),9));
						jk.setSalario((String)tabela1.getValueAt(tabela1.getSelectedRow(),10));
						jk.setEmail((String)tabela1.getValueAt(tabela1.getSelectedRow(),4));
						jk.setEndereco((String)tabela1.getValueAt(tabela1.getSelectedRow(),12));
						jk.setIdade((String)tabela1.getValueAt(tabela1.getSelectedRow(),13));
						jk.setLocalizacao((String)tabela1.getValueAt(tabela1.getSelectedRow(),11));
						jk.setSexo((String)tabela1.getValueAt(tabela1.getSelectedRow(),5));
						jk.setId((String)tabela1.getValueAt(tabela1.getSelectedRow(),0));
						new Alterarfuncionarios(jk);
					} catch (ArrayIndexOutOfBoundsException e1) {
						JOptionPane.showMessageDialog(null, "Selecione um funcionario para ALTERAÇÃO");
					}	
				}
			});

para excluir a mesma coisa:


btnExcluir.addActionListener(new ActionListener() {
				
				public void actionPerformed(ActionEvent arg0) {
					try {
						jk.setNome((String)tabela1.getValueAt(tabela1.getSelectedRow(),1));
						FuncionarioDAO op = new FuncionarioDAO();
						op.excluir(jk);
						setVisible(false);
					} catch (ArrayIndexOutOfBoundsException e1) {
						JOptionPane.showMessageDialog(null, "Selecione um funcionario para EXCLUSÃO");	
					}
				}
			});

e dentro dos meus métodos de alteração, exclusão ou insersão, os próprios métodos ja fazem REFRESH na minha tabela automaticamente.

na execução…


public static void main(String[] args) throws SQLException, ClassNotFoundException {
		
EventQueue.invokeLater(new Runnable() {			
			public void run() {
			TabelaFuncionarios tblFunc = new TabelaFuncionarios();
	                tblFunc.setVisible(true);
                        tblFunc.listarTodos();
			}
		});
	}

+++ mais eu repito, essas nao devem ser as melhores maneiras de se fazer… por isso que entrei no fórum, PARA APRENDER… e APRENDER A ENSINAR…

pq a minha dúvida que tirei aqui no FÓRUM, posso muito bem ensinar a alguém que esta tbm afim de aprender… mais so agora eu me deparei com um problema usando defeautTableModel, problema para imprimir a tabela, ou gerar um relatório…

so consigo imprimir criando uma JTable e adicionando colunas e linhas, através de vectores, sem consultas no BD.

mais eu vou dar mais uma pesquisada… vou tentar implementar consultar a esses vectores de inserção.

e eu estou muuuuito curioso agora em criar uma TableModel, ou tentar usar uma dessas ai AbstractTableModel ou ObjectTableModel…

mais é isso ai…

e galera, confesso, sou leigo em JAVA… so q eu sei bastante coisa… e me preoculpa nao saber se é padrão o não.

e avaliem esses meus blocos de códigos ai e digam o q vcs acham…

valew pessoal… e me desculpe ai qualquer coisa… sou meio retardado as vezes… tenho até medo de pensar que estou virando NERD… kkkkk

valew… lfwssss…

pedro.setVisible(false);>

Sobre as implementações, AbstractTableModel é só a classe abstrata que deve ser implementada para um TableModel eficiente, o ObjectTableModel já é um TableModel generico que implementei.

E os seus códigos usando um TableModel OO (como o ObjectTableModel por exemplo) seriam o seguinte.

public void listarTodos(){
		FuncionarioDAO operac = new FuncionarioDAO();
		ArrayList<FuncionarioGET> lista = operac.consultarTodos();
		
                modelo.addAll(lista); //addAll para adicionar todos ao modelo ou setData para ser exatamente esta lista
	}

Para alterar

	btnAlterar.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent arg0) {
                                                new Alterarfuncionarios(modelo.get(tabela1.getSelectedRow()));
				}
			});

Para excluir


btnExcluir.addActionListener(new ActionListener() {				
				public void actionPerformed(ActionEvent arg0) {
						FuncionarioDAO op = new FuncionarioDAO();
						op.excluir(modelo.get(tabela1.getSelectedRow()));
						setVisible(false);
				}
			});

Muito mais simples não?

Fora o fato que voce nem precisa exibir esse campo id na tabela e deixar apenas para uso interno.

carara bicho… sério mesmo q funciona…???

vou testar aqui e depois eu respondo…

vlws…

não funcionou…

da erro nos GET.

todos as 3 linhas de código q vc passou… listarTodos(), alterar e excluir.

tentei de tudo… mudei o construtor e tudo, e nada…

vlw…

mais deicha essa duvida pra lah… vou procurar as objectTableModel…

flws…

valew ai a tentativa…

O exemplo do Mark mostra como ficaria para adicionar e recuperar funcionários de uma tabela com um table model próprio (FuncionarioTableModel, por exemplo). Com DefaultTableModel, só fazendo esses laços gigantes para carregar o Vector com Strings.

Aqui no GUJ mesmo tem vários exemplos de TableModel espalhados pelos tópicos. Pelos links da assinatura do ViniGodoy e do Mark você encontra ótimos exemplos

http://www.guj.com.br/java/149034-duvidas-ao-fazer-uma-consulta#808003

http://www.guj.com.br/java/147521-inserir-dados-da-jtable-no-banco/3#799170

http://www.guj.com.br/java/132698-jtable-removendo-colunas-em-tempo-de-execucao#714736

http://www.guj.com.br/java/225793-exemplo-de-tablemodel#1156821

aproveitando o tópico… minha dúvida se encaixa aqui tb.
eu tenho 4 listas que juntas formam um registro maior(num cadstro essas 4 formam um grande formulário) e quero pegar algumas propriedades de cada uma dessas listas e colocar num jtable, já vi que vou criar uma tabela que vai extender AbstractTableModel para evitar um certo engessamento do código. Quando eu selecionar uma linha da tabela, quero abrir em outra janela aquele formulário de cadastro, mas dessa vez seria para editar os dados.
Eu fiz um pequeno teste e vi que posso criar a minha tabela com 4 colunas visíveis e criaria uma quinta coluna nos dados para a tabela para guardar a ID de uma dessas listas para poder recuperar, se eu deixa-se esse ID na primeira posição ele é exibido e não quero isso, deixando ele na ultima posição ele não é exibido e posso buscar esse ID para identificar essa linha na tabela e buscar os registros certos para edita-los.
Alguém tem idéia melhor para recuperar esse Id que vai me levar para os registros certos? ou é isso mesmo?
vlw.

O TableModel só exibe o que você pedir para ele mostrar. Como está escrito esse seu TableModel?

eu ainda não o escrevi, estou estudando a uns dias, achava alguns exemplo que lia ruins com o JTable padrão ou passando DefaultTableModel, via que era muito trabalho para popular a tabela.
Eu só preciso que me apontem o caminho para seguir essas descrições, registros formados por campos de objetos diferentes e uma forma de quando selecionado, eu posso buscar todos esse objetos de volta, acho esse forma de deixar o id omitido de um dos objetos, meio estranho e feio.

Tente escrever seu TableModel. Essa dúvida irá desaparecer assim que vc entender como ele funciona.

devo extender AbstractTableModel, é a melhor solução para reescreber meu TableModel e simplificar minha tabela? certo?

Certo.

Certo.[/quote]
acabei de atualizar um post várias alterações sugeridas, tb com a ajuda do amigo do outro post(do link abaixo), realmente fica bem melhor, dividido, legível e flexivel, com o tempo pode-se dizer que realmente é mais fácil ter trabalho hj e menos amanhã.

na tela principal onde tem a tabela que é populada com um beans específico(ele coleta os dados de outros beans para n exibir dezenas de dados), peço para cadstrar, abre-se um formulário, após esse ser preenchido, quero q a tabela atualize. Quando eu conseguir isso, acho q vou fácil no update e delete.
http://www.guj.com.br/java/232068-varios-objetos-em-uma-tabela-no-netbeans/1

Esse post é pra você: http://www.guj.com.br/java/55710-comunicacao-de-dados-entre-duas-janelas#292687

Esse post é pra você: http://www.guj.com.br/java/55710-comunicacao-de-dados-entre-duas-janelas#292687[/quote]
vc se refere a passar sempre os objetos e a divisão das tarefas em cada classe? isso?
o meu problema é quando eu cadastro ou atualizo os dados no formulário, em seguida na tela principal a tabela se atualizar sozinha, eu chamo dentro do formulário o modelo e executo fireTableModelUpdate() e nada de atualizar a tabela.

Vini,
estou ralando sobre a construção de tabelas, e encontrei no google um link que aponta para o site da Oracle que explica o funcionamento do JTable e fornece alguns exemplos.
http://download.oracle.com/javase/tutorial/uiswing/components/table.html
Você poderia me dizer por gentileza, se esse é exatamente o que eu não devo utilizar para construir as tabelas, ou esses exemplos podem ser úteis para mim?

Muito obrigado,

Airton