Atualizar combo Box! [RESOLVIDO]

Olá galera!!!
Estou precisando da ajuda do pessoal aqu ido fórum mais uma vez!!
Bom galera… o problema é o seguinte…
Possuo duas combo box em uma tela de venda… em um comboBox pego do BD os tipo de produtos cadastrados… por exemplo: CD, DVD, Camisa, Blusa Feminina …
Na outra combo que estou com dificuldades… tipo… .estou querendo fazer o seguinte… de acordo com o que o usuário selecionar na como Tipo eu vou e seto a outra combo com os produtos cadastrados daquele tipo específico… Por exemplo: O usuário seleciona o tipo de produto DVD… na outra combo eu mostro todas as opções de DVDs que ele tem para venda…entenderam???
Ou então seleciona Blusa na combo tipo… ae na outra combo eu mostro todas as blusas que ele tem no estoque…
Isso tudo já está arrumado no BD… fiz um m´petodo na DAO que está buscando exatamente como estou pedindo… segue o código: [code]

public Vector consultarTipo(Mercadoria m)
   {
	   try
	   {
		   PreparedStatement sql=DAOFactoryPSQL.getConnection().prepareStatement("select * from mercadoria where tipo like ?");
		   sql.setString(1, m.getTipo()+"%");
		   ResultSet r= sql.executeQuery();
		   Vector v= new Vector();
		   while(r.next())
		   {
			     Mercadoria mercadoria= new Mercadoria();
				 mercadoria.setDescricao(r.getString("descricao"));
				
				 
				 v.add(mercadoria);
		   }
	        return v;
	   }
	   catch (Exception e) 
	   {
		JOptionPane.showMessageDialog(null,"Erro durante a consulta das descrições dos produtos: "+e,"ERRO",JOptionPane.ERROR_MESSAGE);
		   return null;
	}
   }[/code]

Mas o que está acontecendo é que ele seta o outro combo com o primeiro tipo de produto… por exemplo… O primeiro tipo de produto que tem na como é DVD… então ele lista todos os DVDs… .só que quando seleciono outra opção de tipo de produto não sei como vou fazer para atualizar a comoBox com os dados!!!
Segue meu código!!: [code]

package visao;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ActionListener;
import java.util.Vector;

import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;

import modelo.Mercadoria;
import modelo.Tipo;
import dao.DAOFactory;
import dao.DAOMercadoria;
import dao.DAOTipo;

public class TelaVenda extends JFrame {

private JButton btnIncluirItem,btnRealizarVenda,btnCancelar,btnLimpar;
private JPanel pnl1,pnl2,pnl3,pnl4;
private JLabel lblTipoProduto,lblDescricaoProduto;
private JComboBox cmbTipo,cmbDescricao;
private JTextField txtPrecoVenda;
private JTable jTable;
private JScrollPane scrollTabela;
static String guardaTipo,guardaTipo2;
static boolean escolha = true;

Container c;

public TelaVenda (){
	 
	super("Realizar Venda");
	
	//set dos containers e dos gerenciadores principair de layout
	c = getContentPane();
	c.setLayout(new BorderLayout());
	pnl1 = new JPanel();
	pnl1.setLayout(new FlowLayout(0));
	
	
	//carrega os tipos de produtos existentes no Banco de Dados
	cmbTipo = new JComboBox(encheComboBox());
	
	//a variável guardaTipo está coletando o tipo que o usuário selecionou na tela
	//depois é usada no método encheComboBoxDescricao()
	
	
	guardaTipo = (String) cmbTipo.getSelectedItem();
	cmbDescricao = new JComboBox(encheComboBoxDescricao());
	
	
	
	
	
	pnl1.add(cmbTipo);
	pnl1.add(cmbDescricao);
	
	
	
	// adiciona painéis ao container
	c.add(pnl1,BorderLayout.NORTH);
	
	
	
}// fim do construtor





public String[] encheComboBox(){
	
	DAOFactory df=DAOFactory.getDAOFactory(DAOFactory.POSTGRES);
	DAOTipo dao = df.getDAOTipo();
	Vector <Tipo> v;
	v = new Vector(30,10);
	v=dao.consultarTodos();
	int tam = v.size();
	String[] dadosCombo = new String[tam];
	try {
		//String resultDados[][] = dao.getDados();
		
		for (int i=0; i<tam;i++){
			Tipo tipo = v.get(i);
			//int e = v.size();
			dadosCombo[i] = tipo.getTipo();
							
		}
	}
	catch (Exception e){
		JOptionPane.showMessageDialog(null,"Erro durante o preenchimento dos tipos de produto :"+e,"ERRO",JOptionPane.ERROR_MESSAGE);

	}
	
	
	return dadosCombo;
	
	
}// fim do método encheComboBox()

public String [] encheComboBoxDescricao(){

	DAOFactory df=DAOFactory.getDAOFactory(DAOFactory.POSTGRES);
	DAOMercadoria dao = df.getDAOMercadoria();
	Vector <Mercadoria> v;
	v = new Vector(30,10);
	Mercadoria tipo = new Mercadoria();
	tipo.setTipo(guardaTipo);
	v = dao.consultarTipo(tipo);
	int tam = v.size();
	String dadosCombo[] = new String[tam];
	escolha = false;
	for (int i=0;i<tam;i++){
		Mercadoria mercadoria = v.get(i);
		dadosCombo[i]=mercadoria.getDescricao();
	}
	
	
	return dadosCombo;
	
	
}

public void setOuvint (ActionListener controle){
	cmbDescricao.addActionListener(controle);
}





public static String getGuardaTipo() {
	return guardaTipo;
}





public static void setGuardaTipo(String guardaTipo) {
	TelaVenda.guardaTipo = guardaTipo;
}





public static String getGuardaTipo2() {
	return guardaTipo2;
}





public static void setGuardaTipo2(String guardaTipo2) {
	TelaVenda.guardaTipo2 = guardaTipo2;
}





public static boolean isEscolha() {
	return escolha;
}





public static void setEscolha(boolean escolha) {
	TelaVenda.escolha = escolha;
}

}
[/code]

Pleeeeeeeeease galera… me ajuda ae a atualizar essa combo!!!
Um grande abraço a todos!!
Valeu pela ajuda!!!

Oi!

Na minha opinião, eu acho que vc deveria implementar um ActionListener e consequentemente um .addActionListener no 1º ComboBoX.

Assim vc captura o Texto selecionado no 1º ComboBox e podes fazer a consulta com o texto selecionado no Combo.

Por exemplo, para capturar o texto seleccionado, poderia ficar assim:

public void actionPerformed(ActionEvent e) {
       if (e.getSource() == this.jComboBox1){
             String textoSelecionado = (String) this.jComboBox1.getSelectedItem();
       }
}

Se entendí bem seu problema, eu acho que essa sería a solução.

Disculpa a má ortografia.

Até logo!

Olá amigo!!!
Eu também pensei nisso meu amigo…
Só que tipo… eu teria que fazer um listener para cada índice do meu vector…??
Mas sua idéia vai me ajudar bastante amigo!!

[code]
if (comando.equals(“cmbTipo”){
String tipo = (String) cmbTipo.getSelectedItem();

}[/code]

Ae depois acho que teria que usar um método para fazer o teste com cada um dos tipos que tenho no BD e depois pegar os produtos deste tipo no BD!
Ou não seria preciso???
Muito obrigado pela ajuda!!!

Abração!

andre_bento, se não me engano há um probleminha um pouco chato em se tratando de atualização do layout.
Se não me engano você terá que usar thread ou algo do tipo.

Já fizeram perguntas do tipo aqui no forum… dê uma pesquisada que acho que vai clarear pra você.

Abraços,

Olá amigos!!!

Pois é amigão… num to sacando muito bem como vou fazer essa atualização no layout…
To procurando aqui no fórum e no nosso amigo do peito o google mas ainda não achei algo mais parecido com o meu !!!
Vc tem alguma idéia de como posso proceder com isso amigo???

Um grande abraço!

eu tive esse problema uma vez…
Resolvi usando ItemStateChanged.
Adiciona esse evento (ItemStateChanged) na primeira combo.
Aí nesse evento tens que limpar a combo (no seu caso a segunda combo) e fazer o select de acordo com a opção escolhida (getSelectedItem).

Dá uma olhada nesse código que eu fiz.
Ele usa algumas classes que eu não vou colocar aqui, mas a lógica é essa.


private void jComboBoxPacientesItemStateChanged(java.awt.event.ItemEvent evt) {                                                    
        jComboBoxData.removeAllItems();
        int id = UtilDAO.retornaIdCombo((String)jComboBoxPacientes.getSelectedItem(), "IDPESSOA", "PESSOA", "NOME");
        String[] datas = UtilDAO.preencheCombo("DATA", "ATESTADO WHERE IDPESSOA = "+id);
        jComboBoxData.addItem("SELECIONE A DATA");
        for(int x=0; x<datas.length; x++){
            jComboBoxData.addItem(datas[x]);
        } 
           if(jComboBoxData.getItemCount() == 1){
            jComboBoxData.removeAllItems();
            jComboBoxData.addItem("NÃO HÁ ATESTADOS CADASTRADOS!");
        }
}        

No meu código, a jComboBoxData é a segunda combo, e a jComboBoxPacientes a primeira.

[]'s

Olá amigo!!!
Brigadããããão pela ajuda ae cara!!!
Tipo… pra que serve esse ItemStateChanged???

To tentando imaginar aqui como vai ficar com minhas combo box!!!
Se tu tiver uma idéia de código amigo… posta ae!!!
Brigadão pela força!!

Mais uma coisa… o que faz esse método retornaIdCombo() amigão???
Se puder postar o código ae!!!
Abraços!

UP!!!

Ajuda ae galeraaaaaaaa!!!

Não precisa dar up. Assim niguém ajuda mesmo.
bom… mas itemStateChanged é um metodo que é invocado toda vez que um item é selecionado ou deselecionado
Mais detalhes na documentação

Foi mal, só tive tempo de dar uma olhada aqui no fórum agora.
Bom, itemStateChanged é exatamente o que o furutani disse.
Quanto ao método retornaIdCombo(), é um método que retorna o idPessoa do paciente selecionado na combo.
E depois eu listo as datas dos atestados emitidos para aquele paciente (no método preencheCombo()).
Não posso te passar o código pois é um trabalho da faculdade, ainda não finalizei…
Mas a lógica é aquela ali mesmo.
tas usando netbeans?
Se sim, clica com o botão direito na tua primeira combo, e adiciona esse evento (itemStateChanged).
E depois é preencher novamente a segunda combo quando mudar o item selecionado na primeira.

[]'s

E dá uma olhada em ComboBoxModel…

http://java.sun.com/docs/books/tutorial/uiswing/components/combobox.html

Fernando

Olá amigos!!!
Agradeço a todos pela ajuda mas ainda não consegui resolver meu problema!!
Estou tentando com o seguinte código:
Esse é o código de preenchimento dos dados de acordo com o tipo de produto selecionado!

[code]public String [] atualizaCombo(){
String tipoProduto = (String) cmbTipo.getSelectedItem();
//cmbDescricao.removeAllItems();

	DAOFactory df=DAOFactory.getDAOFactory(DAOFactory.POSTGRES);
	DAOMercadoria dao = df.getDAOMercadoria();
	Vector <Mercadoria> v;
	v = new Vector(30,10);
	Mercadoria tipo = new Mercadoria();
	tipo.setTipo(tipoProduto);
	v = dao.consultarTipo(tipo);
	int tam = v.size();
	String dadosCombo[] = new String[tam];
	
	for (int i=0;i<tam;i++){
		Mercadoria mercadoria = v.get(i);
		dadosCombo[i]=mercadoria.getDescricao();
	}
	
	return dadosCombo;
}[/code]

Esse é o código que TENTA setar a combo!

public void updateCombo(){ JComboBox combo = new JComboBox (atualizaCombo()); cmbDescricao.setSelectedItem(combo); }

Tipo… .se faço o debug, essa nova combo que crio no método updateCombo() está com os dados corretos…Pegando de acordo com o tipo selecionado… mas o problema está no seguinte…COMO SETO A MINHA COMBO BOX QUE ESTÁ NA TELA COM OS NOVOS VALORES!!!

Ahhh to fazendo a chamada no controle da seguinte maneira :[code]
if (comando.equals(“tipo”)){

		telaVenda.updateCombo();
		}[/code]

Me ajudem ae galeraaaaaaaaaaaaaa!!!

Galeeeeeeeeeeeera!!!
Consegui finalmente resolver meu problema pessoal!!!
Para ajudar a todos do fórum vou postar ae o código…
Valeu mesmo pelas dicas galera!!!

Meu método para atualizar a comboBox ficou dessa maneira!!!

[code]
public String [] atualizaCombo(){

	String tipoProduto = (String) cmbTipo.getSelectedItem();
	
	JComboBox combo;
	DAOFactory df=DAOFactory.getDAOFactory(DAOFactory.POSTGRES);
	DAOMercadoria dao = df.getDAOMercadoria();
	Vector <Mercadoria> v;
	v = new Vector(30,10);
	Mercadoria tipo = new Mercadoria();
	tipo.setTipo(tipoProduto);
	v = dao.consultarTipo(tipo);
	int tam = v.size();
	String dadosCombo [] = new String [tam]; 
	
	for (int i=0;i<tam;i++){
		Mercadoria mercadoria = v.get(i);
		dadosCombo[i]=mercadoria.getDescricao();
	}
	
	combo = new JComboBox(dadosCombo);
	cmbDescricao.removeAllItems();
	
	for (int i=0; i <tam;i++){
		cmbDescricao.addItem(dadosCombo[i]);
	}
	
	return dadosCombo;
}// fim do método atualizaCombo()[/code]

Ae fiz um ouvinte para a combo… e no controle fiz somente a chamada ao método atualiza combo que está acima!!!
Obridago galera!!!
Um grande abraço!!!