Problema ao carregar dados na jtable

6 respostas
S

Ae pessoal blz? Entao estou com dificuldades de carregar os dados do banco[oracle] em uma jtable…
Os dados até aparecem, mas se multiplicam, como vcs podem ver na imagem:

O certo era aparecer somente uma linha com esses dados e nao se repetindo como apareceu, a parte do codigo que adiciona eles na jtabel é esse:

public void addlotes() {
		ResultSet lotes = null;
		try {
			lotes = con.prepareStatement("select idlotes, refe, qtd, os, nf, nomecli, datae, datas, prazo from lotes").executeQuery();
			while (lotes.next()) {
				String [] adicionar = new String [dados.length];
				for (int i = 1; i <= dados.length; i++) {
					adicionar[i-1] = lotes.getString(i);
					System.out.println(adicionar[i-1]);
					modelo.addRow(adicionar);
				}
			}
		}catch (SQLException a) {
			System.out.println(a);
		}
	}

6 Respostas

nel

Oi!

Você tem dois laços de repetição ai, um que percorre a quantidade de registros retornado pela sua query e a segunda, que é a partir de uma variavél chamada “dados”.
Porque dois laços de repetição se você adiciona uma linha na tabela para cada registro encontrado na query?

Da forma como está fazendo, você está dizendo para criar uma nova linha para cada get() que realiza na sua query. Se você tem 5 variavéis que traz de sua query, você vai ter 5 linhas em sua tabela, dispostas como na imagem. Você tem que ter exatamente a quantida de linhas que a query trouxe e não de acordo com os campos que você precisa.

Você deve dentro do laço de repetição do ResulSet dar todos os gets que você precisa, ou seja, pegar todos os campos necessários para o preenchimento da sua tabela e após isso, você adiciona eles na linha da tabela, caso contrário, vai ficar da forma como postou.

Consegui ser claro?
Abraços.

S

nel, qd ovc diz para dentro do resultset eu pegar todos campos necessarios para o preenchimentoda tabela, vc diz pegar um a um, tipo

select idlotes from lotes;
select refe from lotes;

e assim por diante ou

select * from lotes

?
acho muito dificil essa parte, porem preciso aprender!
obrigado

nel

Não, de forma alguma.
Você tem a query:

select idlotes, refe, qtd, os, nf, nomecli, datae, datas, prazo from lotes

Ela te retorna 9 itens (idlotes, refe, qtd, os, nf, nomecli, datae, datas, prazo), perfeito?
No seu while, faria algo do tipo:

while (lotes.next()) { String idlotes = lotes.getString(1); // outros campos // Depois de pegar TODOS os campos, ai sim, adiciona na linha da sua JTable }

O ResultSet começa em 1, portanto, getString(1), getString(2) e assim por diante, seguindo a sequência definida na sua query (select).
Procure usar um nome mais consistente ao seu ResultSet, eu não iria imaginar que lotes seria o ResultSet, é só uma dica.

Conseguiu compreender amigo?
Abraços.

S

opa nel, fiz aqui, nao sei se exatamente como vc imaginava, deu certo, mas nao me parece ser um modo muito “elegante” como os programadores mais avançados dizem:

fiz assim:

public void addlotes() {
		ResultSet lotes = null;
		try {
			lotes = con.prepareStatement("select idlotes, refe, qtd, os, nf, nomecli, datae, datas, prazo from lotes").executeQuery();
			while (lotes.next()) {
				String idlotes = lotes.getString(1);
				String refe = lotes.getString(2);
				String qtd = lotes.getString(3);
				String os = lotes.getString(4);
				String nf = lotes.getString(5);
				String nomecli = lotes.getString(6);
				String datae = lotes.getString(7);
				String datas = lotes.getString(8);
				String prazo = lotes.getString(9);
				String [] adicionar = new String [dados.length];
				adicionar[0] = idlotes;
				adicionar[1] = refe;
				adicionar[2] = qtd;
				adicionar[3] = os;
				adicionar[4] = nf;
				adicionar[5] = nomecli;
				adicionar[6] = datae;
				adicionar[7] = datas;
				adicionar[8] = prazo;
				modelo.addRow(adicionar);

			}
		}catch (SQLException a) {
			System.out.println(a);
		}
	}

obrigado pela ajuda!

nel

sunsite:
opa nel, fiz aqui, nao sei se exatamente como vc imaginava, deu certo, mas nao me parece ser um modo muito “elegante” como os programadores mais avançados dizem:

fiz assim:

public void addlotes() {
		ResultSet lotes = null;
		try {
			lotes = con.prepareStatement("select idlotes, refe, qtd, os, nf, nomecli, datae, datas, prazo from lotes").executeQuery();
			while (lotes.next()) {
				String idlotes = lotes.getString(1);
				String refe = lotes.getString(2);
				String qtd = lotes.getString(3);
				String os = lotes.getString(4);
				String nf = lotes.getString(5);
				String nomecli = lotes.getString(6);
				String datae = lotes.getString(7);
				String datas = lotes.getString(8);
				String prazo = lotes.getString(9);
				String [] adicionar = new String [dados.length];
				adicionar[0] = idlotes;
				adicionar[1] = refe;
				adicionar[2] = qtd;
				adicionar[3] = os;
				adicionar[4] = nf;
				adicionar[5] = nomecli;
				adicionar[6] = datae;
				adicionar[7] = datas;
				adicionar[8] = prazo;
				modelo.addRow(adicionar);

			}
		}catch (SQLException a) {
			System.out.println(a);
		}
	}

obrigado pela ajuda!

Já é um excelente passo, está funcionando!
Sobre o seu código estar elegante, isso é outra conversa. O que podes alterar ali, é remover variavéis que são “descartaveis”, eu dei a sugestão delas para que ficasse mais claro para você, mas podes usar da seguinte forma:

public void addlotes() {
		ResultSet lotes = null;
		try {
			lotes = con.prepareStatement("select idlotes, refe, qtd, os, nf, nomecli, datae, datas, prazo from lotes").executeQuery();
			while (lotes.next())  {			
				String [] adicionar = new String [dados.length];
				adicionar[0] = lotes.getString(1);
				adicionar[1] = lotes.getString(2);
				adicionar[2] = lotes.getString(3);
				// outros campos que sejam necessários.

				modelo.addRow(adicionar);
			}
		}catch (SQLException a) {
			System.out.println(a);
		}
	}

Perfeito? Nesse caso não precisa utilizar o Pool de String com algo “desnecessário”, adiciona diretamente no seu vetor.
E sinceramente, acho que o código está bom dessa forma.

Abraços.

P.s: problema resolvido? Adicione [Resolvido] ao fim do seu tópico.

S

sim nel, problema resolvido, e com certeza vo fazer essa alteração que vc mostrou, vou economizar codigo :slight_smile:

obrigado, mais uma vez, pela atenção!!

[Resolvido]

Criado 19 de julho de 2011
Ultima resposta 19 de jul. de 2011
Respostas 6
Participantes 2