Como fazer uma combobox carregar itens em outra combo[resolvido]

15 respostas
P

oi
eu tenho 2 combox em uma tela,então gostaria de fazer o seguinte :
eu escolho a disciplina na 1 combo e a partir da disciplina q escolhi eu carrego os modulos na 2 combo
é possivel?
obrigada
:slight_smile:

15 Respostas

M

Você está utilizando qual Framework???
Terá que ser com ajax, caso senha Struts tem o DWR
Caso seja JSF 2 Tem o ajax do JSF
Se for JSF 1.2 tem o a4j.

R

combobox com acesso ao banco.

package Interface.Componente.Componentes;



import Banco.Conexao.Conexao;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.sql.Connection;


import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JComboBox;
import javax.swing.JOptionPane;


public class MeuCombo extends JComboBox implements FocusListener{
    private String sql;
    public  Statement st;
    public  ResultSet rs;
    public  Vector pks = new Vector();
    private Vector vetor = new Vector();
    public MeuCombo(String sql){
        super();
        addFocusListener(this);
        this.sql = sql;
        setMaximumRowCount(10);
        preenche();
    }
   
    public void preenche(){
        try {
            //aqui colocar o codigo para preenchimento do combo e do vetor.
            Connection con = Conexao.abrirConexao();
            try {
             
                 st = con.createStatement();
                 rs = st.executeQuery(sql);
            } catch (Exception e) {
            }


            
            while (rs.next()) {
                addItem(rs.getString(2));
                
                pks.addElement(rs.getInt(1));
                pks.get(this.getSelectedIndex());
            }
        } catch (SQLException ex) {
           
        }
    }

    
   public void setValue(int valor){
    for (int c = 0; c < pks.size(); c++) {
        if ((Integer) pks.get(c) == valor)
            this.setSelectedIndex(c);
    } 
  }     
    
    
     
    public int getValue() {
       return (Integer) pks.get(this.getSelectedIndex());
    }
    
    public void apaga(){
      this.removeAllItems();
      pks.removeAllElements();
  }

    public void focusGained(FocusEvent e) {
        apaga();
        preenche();
       
    }

    public void focusLost(FocusEvent e) {

      
    }
    
}

este combobox faz acesso ao banco e tras o a pk e o nome (codigo disciplina, nome da disciplina)

vc adiciona um focusListener, ou MouseListener que quando perder o foco ou ser clicado mande uma string sql para outro como semelhante a esse, mas que no metodo construtor dele seja assim:

aonde vc declara seus objetos

MeuCombo comboModulo;

na hora de tratar e passar a string sql que foi recuperada pelos eventos

para o valor da PK

sqlGerada fica assim

Lembrando que nao testei a solução. logica bolada enquanto escrevia o post :smiley:

R

Mr.style : é J2SE

M

Ahh foi maus…
Nem vi onde era definido isso…
hehe

É o vício da Web.

R

não ta definido

kkkkk

geralmente eu respondo as perguntas da paty_trind…

já to por dentro do assunto hahahaha

desenvolve usando oq?

EJB, primeface, serverface, jpá, jsf?

P

gente acho que não me expliquei bem,
ah eu pesquiso as disciplinas no banco para 1 combo o problema ta na ação da minha segunda combo pq por enquanto os modulos da 2 combo q eu pesquiso no banco tb sao carregados mas somente quando eu clico em um botao a ação propriamente da combo não tah fazendo isso…
em relação ao itens que voces disseram para fazer as tabelas do banco de dados eu uso o mysqlfront versão5.0 build 1.0,mas ate hoje eu nao consegui gerar pk e fk com ele ate se voces souberem como fazer isto e puderem me explicar fico grata…
obrigada pela ajuda e espero ter explicado melhor :oops:

P

kkk
pior que responde mesmo
mas não ajuda a encontrar a solução :wink: :wink:
hehe
to brincando!!
ajuda sim
:slight_smile:
ah eu desenvolvo no eclipse? :oops:

R

paty_trind:
kkk
pior que responde mesmo
mas não ajuda a encontrar a solução :wink: :wink:
hehe
to brincando!!
ajuda sim
:slight_smile:
ah eu desenvolvo no eclipse? :oops:

ajudar a encontrar a solução eu ajudo, vc que nao consegue implementar :stuck_out_tongue:

vc adicionou

P
fiz assim o metodo que insere as disciplinas na 1 combo dai eu chamo este metodo dentro do botao pesquisar pq estas disciplinas vao vir de acordo com o aluno que foi selecionado
public void carregaDisciplinas()
	{
		try {
			conexao = conecta.conectabanco();
			comando = conexao.createStatement();
		}
		catch(Exception e) {
			JOptionPane.showMessageDialog(null, "Erro na conexÄo do banco");
		}
		try{

			//System.out.println("select distinct materia from disc_aluno where matricula='"+t0.getText()+"'order by materia");
			resultado = comando.executeQuery("select distinct materia from disc_aluno where matricula='"+t0.getText()+"'order by materia");

			comboBox.removeAllItems();
			//System.out.println("antes d while dentro do metodo");
			while(resultado.next())
			{
				comboBox.addItem(resultado.getObject(1).toString());	
				//System.out.println(resultado.getObject(1).toString());//
				//System.out.println("dentro do while,metodo");

			}

			comboBox.setSelectedItem(null);



		}
		catch(Exception e1)
		{
			JOptionPane.showMessageDialog(null, "Erro ao pesquisar disciplinas deste aluno!");
			e1.printStackTrace();
		}

	}
e o metodo que chma os itens da 2 com bo
public void carregaModulo()
	{
		try {
			conexao = conecta.conectabanco();
			comando = conexao.createStatement();
		}
		catch(Exception e) {
			JOptionPane.showMessageDialog(null, "Erro na conexÄo do banco");
		}
		try {
			Object h=null,l=null;
			if(comboBox.getSelectedItem()!=null )
				h=comboBox.getSelectedItem();
			//System.out.println(h);
			{
				//System.out.println("select distinct ensino from disc_modulo where Id_disciplina='"+h+"'");
				resultado=comando.executeQuery("select distinct ensino from disc_modulo where Id_disciplina='"+h+"'");
				if(resultado.next())
				{
					l=resultado.getObject(1).toString();
				}
				//	System.out.println("select distinct modulo from disc_aluno where materia='"+h+"'order by modulo");
				resultado=comando.executeQuery("select distinct modulo from disc_aluno where materia='"+h+"' order by modulo");
				comboBox2.removeAllItems();
				while (resultado.next())
				{
					comboBox2.addItem(resultado.getObject(1).toString());
					//System.out.println(resultado.getObject(1).toString()+" dentro do while");
					//	System.out.println(" dentro do while");
				}

				comboBox2.setSelectedItem(null);
			}

		}
		catch(Exception e) {
			JOptionPane.showMessageDialog(null, "Não há modulos relacionados a esta disciplina!");
			e.printStackTrace();
		}

	}
que eu tambem chamo em outro botao :( mas eu qria carregar esta combo a partir da 1 :(
V

Eu acho melhor implementar isso num ComboBoxModel, aonde os dados deveria ficar. Voce poderia implementar um ComboBoxModel (começando por estender um AbstractListModel) com um Map que mantêm todas as combinações possíveis. Algo como:

private Map&lt;String, List&gt;&lt;String&gt;&gt; todos = new HashMap&lt;String, List&gt;&lt;String&gt;&gt;();

Este Map mantém uma lista de módulos para cada disciplina. Você carrega os módulos para cada disciplina e adiciona no Map:

while (rs.next()) {
   String disciplina = rs.getString("disciplina");
   String modulo = rs.getString("modulo");
   List&lt;String&gt; modulos = todos.get(disciplina);
   if (modulos == null) {
      modulos = new ArrayList&lt;String&gt;();
      todos.put(disciplina, modulos);
   }
   modulos.add(modulo);
}

Seu modelo deve implementar todos os métodos sobre uma lista que seria a lista selecionada a partir do valor da combo pai. E também deve implementar um ActionListener e receber a combo “pai” para ele se atualizar automaticamente:

private Map&lt;String, List&gt;&lt;String&gt;&gt; todos = new HashMap&lt;String, List&gt;&lt;String&gt;&gt;();
   private List&lt;String&gt; valores;

   public MeuComboBoxModel(JComboBox comboPai) {
      this.comboPai = comboPai;
      comboPai.addActionListener(this);
      
      preencheMapa(); // método com o código acima para preencher o Map&lt;String, List&gt;&lt;String&gt;&gt;
      String disciplina = (String) comboPai.getSelectedValue();
      valores = todos.get(disciplina);
   }

   // Exemplo de implementação do ListModel
   public Object getElementAt(int index) {
      return valores.get(index);
   }

   // Implementação do ActionListener
   public void actionPerformed(ActionEvent event) {
      String disciplina = (String) comboPai.getSelectedValue();
      valores = todos.get(disciplina);
   }
R

para fazer isso vc precisa de algum evento

MouseListener, Foculistener

dai vc nao precisa mais do botao

P

calma ai vou modificar alguns itens na tela e qualquer coisa eu ja posto!!!
muitoo obrigada pela ajuda :slight_smile:

P
conseguimos resolver o problema o evento da combo ficou assim
comboBox.addActionListener(new ActionListener() {

			public void actionPerformed(ActionEvent arg0) {
				if (comboBox.getSelectedItem() !=null){
					Object h=null;
					h=comboBox.getSelectedItem();
					try {

						resultado=comando.executeQuery("select distinct modulo from disc_aluno where materia='"+h+"' order by modulo");
						comboBox2.removeAllItems();
						while (resultado.next())
						{
							comboBox2.addItem(resultado.getObject(1).toString());
							System.out.println("item combo modulos: "+comboBox2.getSelectedItem());
						}

						comboBox2.setSelectedItem(null);
						tela.repaint();
					} catch (SQLException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}

				}
			}
		});
mas o problema estava onde eu estava carregando as disciplinas dai eu usei um arraylist para pegar os resultado do banco e fiz um for para add eles na combo ficou assim
try{
			ArrayList<String>disciplinas=new ArrayList<String>();
			resultado = comando.executeQuery("select distinct materia from disc_aluno where matricula='"+t0.getText()+"'order by materia");

			comboBox.removeAllItems();
			while(resultado.next())
			{
				disciplinas.add(resultado.getObject(1).toString());
			}
			for(int i=0;i<disciplinas.size();i++)
			{
				System.out.println("adicionando as disciplinas na combo..."+disciplinas.get(i));
				comboBox.addItem(disciplinas.get(i));	
			}
			for(int i=0;i<disciplinas.size();i++)
			{
				System.out.println("conteudo do vetor de disciplinas..."+disciplinas.get(i));
			}
			System.out.println("depois do for itens da combo "+comboBox.getSelectedItem());
			comboBox.setSelectedItem(null);
			tela.repaint();

		}
		catch(Exception e1)
		{
			JOptionPane.showMessageDialog(null, "Erro ao pesquisar disciplinas deste aluno!");
			e1.printStackTrace();
		}
muitoooooo obrigada pela ajuda!!!!! :D :lol: :lol: :lol: :lol:
R

bem parecido a uma list ne?

hahahahha

P

:shock:
heehheehe
obrigada pela ajuda

Criado 29 de março de 2011
Ultima resposta 30 de mar. de 2011
Respostas 15
Participantes 4