Fazer matriz m de checkbox gerar uma tela para cada objeto de m

4 respostas
P
ola, tenho uma tela em que uso uma matriz de objetos para criar checkboxes,buttons.Há um botão para cada checkbox cada checkbox é uma disciplina cadastrada no banco eu gostaria de saber como eu faço para que cada botão gere uma tela com os modulos da disciplina do checkbox q esta ao seu lado,tipo eu tentei usar um for para percorrer os check e os botoes mas não de u scerto pois ele pega o primeiro check e os modulos da ultima disciplina armazenada na matriz!! Alguém pode me ajudar a arrumar meu codigo ou criar um novo?obg meu codigo é este
//criação das variaveis no inicio da classe
JComboBox cb = new JComboBox();
	String v[]=new String[13];
	Object ck[][] = new Object[v.length][v.length]; 
	String ret[]=new String[ck.length];
	String r[]=new String[ret.length];
//ação da combobox
comboBox.addActionListener (new ActionListener (){
			public void actionPerformed(ActionEvent e)
			{

				try{
				
					pt.setBounds(20, 510, 750, 125);
					pt.setLayout(new FlowLayout());
					int c=0;
					if(comboBox.getSelectedItem().equals("Ensino Medio"))
					{
						pt.removeAll();
						c=1;
						resultado = comando.executeQuery("select nome from disciplina where ensino='"+c+"'order by nome");
						int q=0;
						while (resultado.next())
						{ 
							v[q]=resultado.getObject(1).toString();
							q++;
						}

						for(int i=0;i<ck.length;i++)
						{
							if(v[i]!=null)
							{
								ck[i][0]=new JCheckBox(v[i]);
								ck[i][1]=new JButton();
								ck[i][2]=v[i];
						
								((Component) ck[i][0]).setBounds(x, y1, 150, 25);
								((Component) ck[i][1]).setBounds(x+160, y1, 10, 10);
								((AbstractButton) ck[i][0]).setSelected(true);((AbstractButton) ck[i][1]).setSelected(true);
								pt.add((Component) ck[i][0]);pt.add((Component) ck[i][1]);
								x+=180;
					
								if(i==4 || i==9)
								{
									x=20;
									y1+=30;	
									pt.revalidate();
									pt.repaint(); 
									painel.add(pt);
									tela.repaint();
								}

							}
//aki q eu tentei fazer as gambiarras
							if(ck[i][1]!=null)
							{
								((AbstractButton) ck[i][1]).addActionListener (new ActionListener (){  
									public void actionPerformed(ActionEvent e)
									{
										for(int i=0;i<ck.length;i++)
										{
											if(ck[i][0]!=null && ck[i][1]!=null && ck[i][2]!=null)
											{
												if(((AbstractButton) ck[i][0]).isSelected())
												{	
//concatenando os resultados e depois separando num metodo q uso um arraylist
													ret[i]=(String) ck[i][2];
													if(i==0)
														tudo=ck[i][2]+txt;
													else
														tudo+=ck[i][2]+txt;
													
												}

											}

										}
										getRet();
									
									}});
							}
						}
						
						painel.revalidate();
						painel.repaint();
						tela.repaint();

					}
				
//metodoq separa os itens concatenados
public String getRet()
	{
		StringTokenizer kp=new StringTokenizer(tudo,txt);
		List<String>tx=new ArrayList<String>();
		int pos=0;
		while(kp.hasMoreTokens())
		{
			tx.add(kp.nextToken());
			//System.out.println("testando o stgtkr "+tx);
			//System.out.println("elemento da pos "+pos+" é "+tx.get(pos));
			pos++;
		}
		for(int i=0;i<ck.length;i++)
		{	if(ck[i][1]!=null)
		{	
			((AbstractButton) ck[i][1]).addActionListener (new ActionListener (){  //inclui o aluno na turma q n estiver cheia

				public void actionPerformed(ActionEvent e)//so exibe as turmas q ainda podem inserir alunos
				{
					System.out.println("dentro da acao do botao");
					for(int i=0;i<ck.length;i++)
						if(((AbstractButton) ck[i][1])==e.getSource())
							System.out.println("antes de chamar o metodo q cria tela d mode");
					crianovatela();//erro so seleciona artes ele n muda o i
				}});
			System.out.println("o elem selecionado "+tx.get(i));
			return tx.get(i);
		}
		}

		return "problema";

	}

//metodo q cria as telas com os modulos e usa o resultado do metodo acima
	public void crianovatela()
	{
		JFrame telinha=new JFrame("Tela de modulos");

		try {
			conexao = conecta.conectabanco();
			comando = conexao.createStatement();
		}
		catch(Exception x) {
			JOptionPane.showMessageDialog(null, "Erro na conexÄo do banco");
		}
		try{
			//funciona mas agora pega a ultima posição=[
			btn1.setBounds(20, 180, 50, 15);
			String k=null;

			for(int i=0;i<ret.length;i++)
			{	
				getRet();
				System.out.println("o valor de getret() "+getRet());
				if(ret[i]!=null )
				{
					k=ret[i];
					System.out.println("valor da var ret[i] "+ret[i]+" valor d k "+k+" select modulo from disc_modulo where Id_disciplina='"+k+"'order by modulo");//ta pegando a ultima pos
					//	if(ret[i].equalsIgnoreCase(ck[i][0].toString()))//c ret[i] for igual ao ck selecionado
					resultado = comando.executeQuery("select distinct modulo from disc_modulo where Id_disciplina='"+k+"'order by modulo");
					int q=0;
					while (resultado.next())
					{
						k1[q]=resultado.getObject(1).toString();
						System.out.println("o resultado da pesquisa no banco "+k1[q]+" na pos "+q);
						q++;
					}
					if(k!=null)
					{
						pan=new JPanel();
						pan.setBounds(20,20, 350, 150);
						pan.setBackground(Color.cyan);
						for(int i1=0;i1<j.length;i1++)
						{

							if(k1[i1]!=null)
							{
								j[i1]=new JCheckBox(k1[i1]);
								j[i1].setBounds(x1, y11, 150, 25);
								j[i1].setSelected(true);
								pan.add(j[i1]);
								y11+=30;
								if(i1==3 || i1==8)
								{
									x1=20;
									y11+=30;	
									pan.repaint();

								}
							}
						}
					}
				}

			}
obrigada pela ajuda

4 Respostas

P

alguém?

E

Poxa paty, eu até quero te ajudar, mas não to conseguindo entender teu código. Seria bom dar uma refatorada.

Eu não conseguir entender direito o significado do k, do ret, do tudo, enfim, tenta colocar umas variáveis com nome mais intuitivos, tipo “ckMaterias”.

Outra coisa, teus métodos tão fazendo coisas demais, o que também me confunde. O getRet por exemplo, chama o métod crianovatela, que também chama o getRet, ou seja, um cilclo vicioso, que acada execução adiciona um listenner a cada execução.

Tem atributos de classe aí que poderiam ser parâmetros dos métodos e vice-versa.

Use GridLayout() com layoutmangaer, pois usar setbounds deixa o código ainda mais confuso.

Queria te perguntar umas coisas também: porque na linha 39 tu dá dois setSelected(true)?

A linha 117 tá só retornado o primeiro i, pois antes de ele mudar o for, tu tá exectuado um return.

Tenta fazer essas mudança que tu acaba achando o erro.

P

obrigada elissonandrade
tu tens razão meu código ta muito grande e dificil de entender vou fazer estas alterações que tu disseste e eu uso o setSelected(true)pq por padrão todos os checkboxes ja deveram vir marcados
e tens razão é por causa do return q ele so joga a primeira disciplina cmo posso fazer para q cada uma seja retornada uma vez ou para que eu consiga usar todas?
mtooo obg pela ajuda
=]

E

Pois então, o caso é justamente esse: eu não consegui entender onde ela será usada. Olha o método getRet é chamado em duas ocasiões: quando o combobox é clicado e quando o criarnovajanela() é chamado. E nessa duas ocasiões ele não retorna o valor pra nenhuma variável. Aliás, ele não modifica nada que você use em outro lugar, nem o próprio array ret, que é o que parece que você tá usando pra retorna matéria.

Eu queria poder ajudar mais, mas eu não to conseguindo acompanhar o fluxo do programa.

Divida seu código em métodos mais curtos, tente transformar os atributos em parâmetros de métodos, e renomear suas variáveis. Tenho quase certeza que depois de fazer isso você mesma vai descobrir o erro. Caso contrários, poste aqui o novo código. Sem ele, não tem como ajudar mais.

Eu sei que esse trabalho de mudar é chato e tira o tempo de quem tem prazo, mas poupa muito mais tempo pra resolver os problema de depois.

Criado 22 de fevereiro de 2011
Ultima resposta 26 de fev. de 2011
Respostas 4
Participantes 2