Duvida Preencher JTable

18 respostas
wagne23

Ai gente to com o seguinte problema, criei um programa que grava infos de pessoas em um arquivo .DB, e usando uma JList eu consigo mostrar o nome das pessoas que foram salvas, mas to querendo fazer o mesmo com uma JTable mas ta dificil, sera que alguem pode me ajudar ? eu tentei criar um metodo para recuperar esses valores mas não ta funcionando. Ai vai o metodo:

private void preencheTabela(DefaultTableModel modelo){
		Collection lista = null;
		try{
			if(Caravana != null){
				lista = Caravana.recuperaMembro();
				Iterator it = lista.iterator();		   
		     	 
				while (it.hasNext()){
					String [] row = (String[]) it.next();
					modelo.insertRow(0, row);
				}
			}
		}catch(Exception e){
			e.printStackTrace();
		}
	}
eu tentei seguir a mesma logica usada com a JList que estava assim:
private void fillMembrosModel(DefaultListModel model){
		Collection lista = null;
		try{
			if(Caravana != null){
				lista = Caravana.recuperaMembro();
				Iterator it = lista.iterator();
				while (it.hasNext()){
					Membro mbr = (Membro) it.next();
					model.addElement("    "+mbr.getNome());
				
				}
			}
		}catch(Exception e){
			e.printStackTrace();
		}
	}

e assim funcionou legal.

Alguem tem ideia de como me ajudar???
To ficando doido com isso e não consigo resolver, sei que deve ser uma coisa simples mas é que eu to começando agora no mundo Java. sera que alguem tem pelo menos um exemplo ???

18 Respostas

_fs

Você declarou as colunas corretamente no Model da JTable? A variável “row” contém os valores esperados?

Fora isso o código parece correto:
http://exampledepot.com/egs/javax.swing.table/InsertRow.html

Marky.Vasconcelos
wagne23:
Ai gente to com o seguinte problema, criei um programa que grava infos de pessoas em um arquivo .DB, e usando uma JList eu consigo mostrar o nome das pessoas que foram salvas, mas to querendo fazer o mesmo com uma JTable mas ta dificil, sera que alguem pode me ajudar ? eu tentei criar um metodo para recuperar esses valores mas não ta funcionando. Ai vai o metodo:
private void preencheTabela(DefaultTableModel modelo){
		Collection lista = null;
		try{
			if(Caravana != null){
				lista = Caravana.recuperaMembro();
				Iterator it = lista.iterator();		   
		     	 
				while (it.hasNext()){
					String [] row = (String[]) it.next();
					modelo.insertRow(0, row);
				}
			}
		}catch(Exception e){
			e.printStackTrace();
		}
	}
eu tentei seguir a mesma logica usada com a JList que estava assim:
private void fillMembrosModel(DefaultListModel model){
		Collection lista = null;
		try{
			if(Caravana != null){
				lista = Caravana.recuperaMembro();
				Iterator it = lista.iterator();
				while (it.hasNext()){
					Membro mbr = (Membro) it.next();
					model.addElement("    "+mbr.getNome());
				
				}
			}
		}catch(Exception e){
			e.printStackTrace();
		}
	}

e assim funcionou legal.

Alguem tem ideia de como me ajudar???
To ficando doido com isso e não consigo resolver, sei que deve ser uma coisa simples mas é que eu to começando agora no mundo Java. sera que alguem tem pelo menos um exemplo ???

Seguindo a mesma lógica poderia ficar algo como assim

private void preencheTabela(DefaultTableModel modelo){
		Collection lista = null;
		try{
			if(Caravana != null){
				lista = Caravana.recuperaMembro();	   
		     	 
				for (Membro m : lista){
					String [] row = {m.getNome()}
					modelo.insertRow(row);
				}
			}
		}catch(Exception e){
			e.printStackTrace();
		}
	}
PS: não use DefaultTableModel, crie sua própria TableModel que extenda a AbstractTableModel
ViniGodoy

Apoiadíssimo.

wagne23

Mark_Ameba valeu pela ajuda mas ainda ta dando erro.

for (Membro m : lista){ String [] row = {m.getNome()}; modelo.insertRow(0,row); }

estou usando o eclipse e ele me mostra um erro : “Type mismatch: cannot convert from element type Object to Membro” na linha for (Membro m : lista){. :?:

ViniGodoy

Você tem que definir o tipo dos generics da lista.

Comece a usar coleções assim:

private void fillMembrosModel(DefaultListModel model){ Collection<Membro> lista = null; //Collection<Membro> ao invés de só Collection try{ if(Caravana != null){ lista = Caravana.recuperaMembro(); for (Membro mbr : lista) { model.addElement(" "+mbr.getNome()); } } }catch(Exception e){ e.printStackTrace(); } }

Caso contrário, o get de sua lista retornará um Object. E certifique-se que sejam realmente membros que estejam cadastrados na Collection que retorna de recuperaMembro.

Gobain

Apoiadíssimo.

Desculpa minha ignorância, mas pq não? Ou pq não extender a DefaultTableModel?
A DFTM já tem métodos implementados de add/insertRow, o q facilita bastante não é?

Manda uma explicaçãozinha ae!! :smiley:

ViniGodoy

O DefaultTableModel lida com Strings, aliás, um Vectors de Vectors de String.

O correto é você fazer um Model que apenas mostre como a Table deve representar os seus objetos de negócio. Esse model lida com os objetos em si. Isso te dá vantagens como:

  1. Se você precisar pegar o objeto que está na linha selecionada, basta pedir para seu model:
Pessoa pessoa = modelPessoas.get(tableDePessoas.getSelectedRow());
  1. Você pode adicionar e remover objetos do model diretamente, sem a necessidade de converte-los para strings coluna a coluna:
modelPessoas.add(new Pessoa("Vinícius", "Godoy de Mendonça", 15));
  1. Você pode carregar o model com a lista diretamente retornada pelo seus métodos fábrica:
modelPessoas = new ModelPessoas(Pessoa.loadAllFromDB());
  1. A informação de suas classes de negócio não fica duplicada nas Strings do model. O que significa uma economia de pelo menos 50% em termos de memória;

  2. O DefaultTableModel baseia-se em Vectors de Vectors. Vectors são sincronizados, antigos e pouco eficientes. O seu model personalizado pode trabalhar com ArrayLists (ou a lista que você quiser). E dificilmente terá que usar ArrayLists aninhados (ArrayLists de ArrayLists);

  3. O código fica mais orientado a objetos, mais simples e mais organizado;

  4. Usar o DefaultTableModel deixa muita lógica dentro do código da interface gráfica (provavelmente do JFrame). Com o AbstractTableModel, isso fica muito mais encapsulado;

  5. Entender como usar os models corretamente é o primeiro passo para entender como recursos avançados como filtros, renderers e editors personalizados funcionam;

  6. É mais fácil controlar modificações feitas no JTable com um model próprio.

Também não vejo vantagem em trabalhar com um filho de DefaultTableModel. Duplicar os valores de seus objetos nos vectors de vectors dessa classe é mais difícil e muito menos eficiente.

Gobain

Bom, então eu defino como os objetos serão armazenados no model certo?
Daí eu uso um ArrayList genérico ou defino minha classe de objetos que eu quero listar na table?

wagne23

Cara valeu mesmo, agora ta funcionando legal, mas pelo visto tenho que aprender muita coisa ainda. Tem alguma dica de como criar o minha propria TableModel ? Algum tutorial ou sei la ?? Mais uma vez obrigado a todos.

wagne23

Ai sem querer abusar muito, vi que ainda tenho um “probleminha”, é que depois que eu cadastro alguem , ele não aparece na tabela, so depois que eu reinicio a aplicação, como eu faço para atualizar assim que eu cadastrar alguem ja me mostrar na tabela? (Desculpem a minha falta de conhecimento).

ViniGodoy

Você pode baixar esse TableModel simples e ver como funciona:
http://www.guj.com.br/posts/list/57203.java#300612

Você também pode ver o site da Sun sobre o assunto:
http://java.sun.com/docs/books/tutorial/uiswing/components/table.html

E esse site na net:
http://www.informit.com/articles/article.aspx?p=332278&seqNum=1

ViniGodoy

O TableModel precisa avisar o Table de que o item foi adicionado. Para isso, procure por um método chamado fireTableRowsAdded (ou Inserted, agora não lembro). Haverá outros métodos também para avisar que os dados mudaram ou que linhas foram excluídas.

Gobain

ViniGodoy:

E esse site na net:
http://www.informit.com/articles/article.aspx?p=332278&seqNum=1

Cara, esse link foi tudo de bom!
Tirou todas as minhas dúvidas!!! Valeu mesmo!

Marky.Vasconcelos

O TableModel precisa avisar o Table de que o item foi adicionado. Para isso, procure por um método chamado fireTableRowsAdded (ou Inserted, agora não lembro). Haverá outros métodos também para avisar que os dados mudaram ou que linhas foram excluídas.

Minha primeira TableModel eu fiz baseada nesses exemplos^^

Gobain

Olhe, esse exemplo que o ViniGodoy passou exclareceu minhas dúvidas de como usar o AbstractTableModel, e facilitou muito meu trabalho com tabelas…
Usei um ArrayList pra guardar os dados das minhas classes do BD… cortou pela metade o trabalho q eu tinha pra tratar os dados que antes estavam em Object[][] :slight_smile:

fabim

Agora faça a sua Jtable, qdo clicar no header da coluna, ordenar os registros por essa coluna.
:idea: Use comparable e comparator

wagne23

Valeu gente, agora ta funcionando legal. Muito Obrigado !!!

Gobain

fabiocsi:
Agora faça a sua Jtable, qdo clicar no header da coluna, ordenar os registros por essa coluna.
:idea: Use comparable e comparator

Ordenação eu já tinha feito…
É q eu não tinha entendido direito os conceitos do AbstractTableModel

Criado 22 de outubro de 2007
Ultima resposta 24 de out. de 2007
Respostas 18
Participantes 6