Editando meu proprio defaulttablemodel

ola,
alguem pode me ajudar?como faço para controlar o lugar onde a coluna vai ser criada na jtable?
por exemplo estou criando novas colunas na minha jtable conforme o resultado de uma pesquisa do banco mas o problema e que não estou conseguindo reacionar os itens criados com os ja existentes na jtable dai fica uma tabela grande e desordenada o metodo que estou usando para criar novas colunas é o seuinte [for(int i=0;i<v.length;i++) if(v[i][0] != null) { cold[i]=v[i][0]; } String col="nota"; modelo.addColumn(col,cold);
so q eu qria q as linhas dele ficassem na mesma linha q os itens das outras colunas mas eles ficam embaixo fica mais ou menos assim
nome|nota
laura|
maisa|
|63//nota d laura
|45//nota da maisa

como posso arrumar isto?
obg

Você já chegou a debugar isso?
Porque pelo que me parece é que o seu vetor cold está vazio. Por isso ele está criando a coluna vazia.

O seu primeiro vetor deve esta com todos os dados. Coloca um println dentro deste if para ver o valor de cold[i]:

System.out.println(cold[i]);

Voce deve definir suas colunas no TableModel.

Veja na minha assinatura como fazer isso.

Visola
coloquei o system e ficou assim no console

[code]select distinct disciplina,modulo from nota where rc_aluno=‘5’

3.0
3.0
3.0
3.0
3.0
[/code]
e minha tabela fica assim como no print


paty… não tenho idéia o que está acontecendo.
Vamos precisar de mais código e uma explicação mais detalhada para entender o que está acontecendo.

O que acontece é que voce está usando addColumn para criar uma coluna para cada nota, quando na verdade voce devia primeiro definir como vai ser o modelo, depois preencher os dados nos respectivos lugares.

Para aprender isso que te indiquei estudar sobre como funciona o TableModel.

ah tah é q estou aprendendo ainda sobre isto :oops: vou ler os links de sua assinatura d novo qualquer coisa eu posto=]

meninos voces tem razão sobre o defaulttablemodel
então estou criando o meu proprio e tipo eu vi q vai ser bem melhor pq vou poder usa-lo nas outras jtables
estou implementando meu proprio defaulttablemodel na hora em q uso na aplicacao so aparece as colunas as linhas nao! segue em anexo minha classe da defaul fiz conforme modelo dos colegas
:lol: bg pela ajuda

estou usando meu default table model criei a partirde exmplos tirados de topicos aqui do guj a minha tabela esta do jeito q eu realmente queria mas agora estou com um problema no preenchimento das linhas tipo eu cnsigo preencher uma ou varias linhas iguais! :oops: tipo na classe em q qro usar a minha jtable eu crio um objeto da classe q uso na default mas por ter q usar os metodos set e o resultado do banco vir em um array acaba q ele so troca pelo ultimo resultado da pesquisa!como arrumar isto?estou fazendo assim
segue minhas classes em anexo
mas o metodo onde estou tentando usar a tabela é o seguinte

[code]Aluno1TableModel model;
private void geraTabela3()
{
try
{
String k[]=new String[12];int q=0;String k1[]=new String[12];int y=0;
String x[]=new String[k.length]; int y1=0;String x1[]=new String[x.length]; int y2=0;
Aluno1 socio=new Aluno1();
model=new Aluno1TableModel();

		resultado = comando.executeQuery("select nome from aluno where Id='"+ t0.getText() +"'");
		while(resultado.next())
		{
			socio.setNome(resultado.getString(1));
			System.out.println(resultado.getString(1));
			model.addAluno(socio);
		}

		resultado = comando.executeQuery("select distinct disciplina,modulo from nota where rc_aluno='"+ t0.getText() +"'");
		while(resultado.next())
		{
			for(int i=0;i<k.length;i++)
			{
				k[i]=resultado.getString(1);
				k1[i]=resultado.getString(2);
				System.out.println("k[q] "+resultado.getString(1)+" k1[q] "+resultado.getString(2));
				
					socio.setTelefone(k[i]);
					model.addAluno(socio);
				
					socio.setModulo(k1[i]);
					model.addAluno(socio);
				
			}
		}


		for(int i=0;i<x.length;i++)
		{	if(k[i]!=null)
		{
			resultado = comando.executeQuery("select atividade,nota from nota where rc_aluno='"+ t0.getText() +"'and disciplina='"+ k[i] +"' and modulo='"+k1[i] +"'");
			while(resultado.next())
			{
				x[i]=resultado.getString(1);
				x1[i]=resultado.getString(2);
				if(x[i]!=null)
				{
					socio.setAtividade(x[i]);
				model.addAluno(socio);
				}
				if(x1[i]!=null)
				{
					socio.setMensalidade(x1[i]);
				model.addAluno(socio);
				}
				System.out.println("atv "+x[i]+" nota "+x1[i]);

			}
		}
		}

		table = new JTable(model);
		JScrollPane scroller = new JScrollPane(table);
		scroller.setVisible(true);
		scroller.setBounds(20, 270, 700, 150);
		painel.add(scroller, null);
		//fazer com que todos os itens do array de disciplina seja add na jtable

	}
	catch (SQLException erro) {
		erro.printStackTrace();
	}
}[/code]

obg pela ajuda

Você tá criando o objeto socio, do tipo Aluno fora de todos os loops. Esse objeto é referência para os dados que estão na memória. Quando você passa ele no addAluno do seu model, por exemplo, está criando uma nova referência para os mesmos dados na memória. Até o primeiro loop isso está ok porque ele vai ter os dados que você quer. Na segunda vez que o loop rodar, você vai alterar o mesmo objeto na memória para um novo valor e adicioná-lo mais uma vez (criando mais um apontamento para o mesmo objeto).

Você precisa criar um novo Aluno toda vez que passar por um loop e chamar addAluno, senão, quando alterar o valor do objeto, ele vai refletir em todos os lugares ao mesmo tempo.

Não sei se o desenho em anexo ajuda a entender o problema, quem sabe. :slight_smile:

ah agora entendi o q estava fazendo errado! :oops:
olha só fiz do jeito q tu disseste ,criei um objeto do tipo Aluno1 em cada laço dai tipo agora aparece todos os itens na tabelaso q tipo else não ficam na mesma linha pq eu to usando duas pesquisas,teria como eles ficarem? é q tipo numa pesquisa eu to usando o distinct e na outra eu não posso usar por isto fiz duas pesquisas…e mesmo assim meu distinct não ta funcionando eu acho pq na tabela aparece varias vezes a mesma disciplina e modulo :shock: meu codigo ficou assim[code]resultado = comando.executeQuery(“select distinct disciplina,modulo from nota where rc_aluno=’”+ t0.getText() +"’");
while(resultado.next())
{
for(int i=0;i<k.length;i++)
{
k[i]=resultado.getString(1);
k1[i]=resultado.getString(2);

				Aluno1 socio1=new Aluno1();
					socio1.setTelefone(k[i]);
					socio1.setModulo(k1[i]);
					model.addAluno(socio1);
			}
		}


		for(int i=0;i<x.length;i++)
		{	
			resultado = comando.executeQuery("select atividade,nota from nota where rc_aluno='"+ t0.getText() +"'and disciplina='"+ k[i] +"' and modulo='"+k1[i] +"'");
			while(resultado.next())
			{
				x[i]=resultado.getString(1);
				x1[i]=resultado.getString(2);
				Aluno1 socio1=new Aluno1();
					socio1.setAtividade(x[i]));
					socio1.setMensalidade(x1[i]);
					model.addAluno(socio1);
			
			}
		
		}

		table = new JTable(model);[/code]

obg pela ajuda

Paty, você não precisa de duas consultas. O distinct que você colocou na verdade você não quer… eu acho. Pelo que entendi das coisas que você está colocando no aluno e no modelo, você quer uma tabela com as notas de todos os alunos por atividade, é isso mesmo? Se for, acho melhor você fazer da seguinte forma:

resultado = comando.executeQuery("select nota, atividade, disciplina, modulo from nota where rc_aluno='"+ t0.getText() +"'");  
while(resultado.next())  
{  
	for(int i=0;i&lt;k.length;i++)  
	{  
		Aluno1 socio1=new Aluno1();  

		// Preenche com os dados
		socio1.setMensalidade(resultado.getString("nota"));
		socio1.setAtividade(resultado.getString("atividade"));
		socio1.setTelefone(resultado.getString("disciplina"));  
		socio1.setModulo(resultado.getString("modulo"));

		model.addAluno(socio1); // Adiciona no modelo
	}  
}

Uma coisa que notei ao fazer o código acima é que os nomes da suas colunas na tabela não estão de acordo com os setters que você está chamando no seu objeto aluno, isso tá certo??? Toma cuidado porque esse tipo de coisa só vai adicionando confusão no seu código, você vai esquecer qual mapeou para qual e vai fazer errado, cedo ou tarde.

Outra coisa… não precisa desses arrays, até onde eu consigo ver, você não usa eles para mais nada. Não precisa colocar os dados nos arrays para depois colocar no objeto Aluno, pode fazer tudo de uma vez só, a não ser que esteja usando eles para outra coisa. Além do quê, ainda corre o risco de inserir mais dados no banco e eles não caberem no array, aí você vai acabar jogando uma exceção ArrayIndexOutOfBoundsException.>

humm
sei que tenho q tomar mais cuidado com os codigos pois eles ficam bem confusos mesmo com os nomes trocados digamos assim
vou editar o codigo e qualquer coisa volto a postar!!
bah mtoo obg pela ajuda!!!
=]

bah obg Visola,
conseguimos resolver o problema!!!
mas posso te alugar mais um pouco?
como eu poderia fazer para tipo inves das atividades ficarem uma embaixo da outra elas ficarem do lado.Eu pensei em criar colunas de acordo com o numero de atividades de cada disciplina mas isto no meu defaulttablemodel.Tipo estou fazendo o seguinte metodo[code]public void pesquisa()
{
try {int q=0;
String f=null;
System.out.println("select max(ch_total) from cargahoraria ");
resultado=comando.executeQuery("select max(ch_total) from cargahoraria ");
while(resultado.next())
{
f=resultado.getString(1);
System.out.println(f);
}
q=Integer.parseInt(f);
atividades=new String[q];
System.out.println("valor de q “+q+” valor de f "+f);
for(int i=0;i<atividades.length;i++)
{
atividades[i]=“atv”+i;
colunas[i]=atividades[i];
}

	} catch (SQLException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	
}[/code]

tipo qria pegar o maior valor da ch e criar uma tabela com a quantidade de atividades deste mesmo valor tipo se a maior ch_total for 5 fazer 5 colunas de atividade,isso é possivel?
eu só trago problemas neh? :slight_smile:
:lol: bg pela ajuda!!!

consegui criar as colunas dakela maneira q eu havia dito antes mas agora a questão é q os valores resultados das pesquisas não ficam nos lugares corretos,ha uma maneira de alinhar isto?
obg

No seu TableModel você diz qual dado vai aparecer em qual coluna. Como está o seu TableModel?

no meu tablemodel eu só defino os nomes das colunas tipo agora eu ate consegui resolver o problema dos campos das atividades tipo ja ta dando para instanciar as colunas de atividades de acordo com o numero de atividades registradas no banco.
Mas na classe em q utilizo meu default ao fazer a pesquisa para preencher a tabela tipo os dados não ficam no lugar certo com exceção nas colunas disciplinas e modulos dai eu pensei no seguinte pegar todas as atividades jogar num vetor e depois fazer um for para inserir cada item em uma coluna de atividade o codigo ficou assim[code]resultado = comando.executeQuery(“select disciplina,modulo,nota,atividade from nota where rc_aluno=’”+ t0.getText() +"’");
while(resultado.next())
{
Aluno1 socio1=new Aluno1();
socio1.setDisciplina(resultado.getString(1));
socio1.setModulo(resultado.getString(2));

					socio1.setNota(resultado.getString(3));
					v[q]=resultado.getString(4);
					q++;
					
					for(int i=0;i<model.getColumnCount();i++)
					{
						System.out.println(model.getColumnName(i));
						if(model.getColumnName(i).equalsIgnoreCase("atv"))
							socio1.setAtividade(v[i]);
						model.addAluno(socio1);
					}
					model.addAluno(socio1);
			
		}[/code]

mas ainda não ta dando mto cert :oops:
obg pela ajuda
=]

genteeeeeee!
bah ainda não consegui ordenar isto!=[
e o pior eu vi q conforme eu aumento o tamanho da minha tabela eu aumento meu numero de linhas bem no momento meu codigo é o seguinte

Aluno1TableModel model; private void geraTabela3() { try { model=new Aluno1TableModel(); String v[]=new String[13];int q=0; resultado = comando.executeQuery("select disciplina,modulo,nota,atividade from nota where rc_aluno='"+ t0.getText() +"'"); while(resultado.next()) { //primeiro pegar todos os campos preenchidos e depois organiza-los lado a lado na jtable Aluno1 socio1=new Aluno1(); socio1.setDisciplina(resultado.getString(1)); socio1.setModulo(resultado.getString(2)); //socio1.setAtividade(resultado.getString(3)); socio1.setNota(resultado.getString(3)); v[q]=resultado.getString(4); q++; //fazer um for e ir add o conteudo de v nas colunas for(int i=3;i<model.getColumnCount();i++) { System.out.println(model.getColumnName(i)); if(model.getColumnName(i).equalsIgnoreCase("atv")) { socio1.setAtividade(v[i]); model.addAluno(socio1); System.out.println("valor "+v[i]+" na pos "+i); } } model.addAluno(socio1); }
tipo minha tabela ta ficando como o print abaixo
obg pela ajuda


Seu TableModel já é responsavel por popular as colunas, voce só precisa adiconar a linha.

Seu codigo deveria ser somente o seguinte:

Aluno1TableModel model;
	private void geraTabela3()
	{
		try
		{
			model=new Aluno1TableModel();	
			resultado = comando.executeQuery("select disciplina,modulo,nota,atividade from nota where rc_aluno='"+ t0.getText() +"'");
			while(resultado.next())
			{
				//primeiro pegar todos os campos preenchidos e depois organiza-los lado a lado na jtable
				Aluno1 socio1=new Aluno1();
				socio1.setDisciplina(resultado.getString(1));
				socio1.setModulo(resultado.getString(2));
				socio1.setNota(resultado.getString(3));
				socio1.setAtuvidade(resultado.getString(4));

				model.addAluno(socio1);
	}

oi
ah eu tentei desta forma mas não deu muito certo como tu podes ver no print em anexo ,eu deveria usar o getvalueat()?
teria como?
obg