JComboBox - urgente

12 respostas
D

Olá galera…
Estou com um problema novamente…
tenho uma tela de pesquisa e tem os seguintes campos…
um textfield para entrar com o código e um botão pra executar a busca…
e quando achado o codigo eu jogo os dados em um JComboBox… até ai beleza… só que estou com problemas quando faço isto mais de uma ves… por exemplo na 1ª vez eu carrego o codigo no combo e beleza só na 2ª pesquisa ele tem que carregar o combo novamente e tirar o valor antigo e entrar com valores novos… ai o problema eu não estou conseguindo fazer isto… se eu mandar criar um novo combo por cima ele não cria…
Obrigado

12 Respostas

cariocathi

Aconteceu isso comigo uma vez, mudei tudo pra mvc e daí começou a funcionar :lol:

D

Desculpe ai, mas o que seria mvc?

cariocathi

Modelo de desenvolvimento de sistemas em 3 camadas ou seja
vc separa o Modelo da comada de Controle que é separada tb das Views e seu sistema fica independente, assim vc pode escrever seu programa uma vez e se kizer portalo por exemplo para web, vc só precisa escrever os jsp q vao acessar o controller. Entendeu ?

Não ?

exemplo em www.cariocathi.brturbo.com/help/mvc

I

Tente fazer o seguinte.

Antes de vc colocar a inserção no JComboBox coloque:

NomeJComboBox.removeAll();

D

Então pessoal ainda não deu certo… como faço para remover do meu frame o JComboBox, então… ?
Eu usei este removeAll e nada… e quanto ao mvc… ainda não é pra mim não…
eu pensei em remover totalmente o combo do meu frame ai quanto eu fizer uma nova busca eu crio um novo combo… o que acham?.. mas me digam como apago do meu frame o combo??
Agradeço a atenção…

cariocathi

pegou o exemplo q eu passei ?
no mvc, vc tem q desenvolver o Modelo de dados, em uma classe q herda o modelo da JComboBox, daí lá dentro vc faz o q quer( veja no exemplo q passei as classes Model ); e na combo vc só precisa passar o modelo pra ela no construtor.

Eu sei q é confuso, mas assim que sair a primeira o negócio fica mais claro.

Ironlynx

cariocathi,
seu exemplo é muito bom,mas a falta de documentação atrapalha muito quem quiser analisar seu código classe-a-classe. Quem não souber nada de MVC pode ficar ,digamos assim,perdido! :wink:

cariocathi

verdade, nao fiz uma documentação pq era pra faculdade e aí já viu né…

mas vou tentar resumir:

Vc tem um modelo de dados onde lá é q acontecem TODAS as operções sobre os teus objetos.( extends Observable )
Qnd há alguma ação nesta classe ela notifica os observadores pelas linhas:setChanged(); notifyObservers();
Essas duas linha server pra fazer as alterações nos modelos de APRESENTAÇAO, no seu caso um modelo de Combo.( implements Observer )

acho q agora deu uma melhorada pra vc estudar as classes.

vlw ?

D

Valeu Cariocathi…
vou estudar a respeito de mvc, mas é que agora estou com certa urgência de resolver este problema, pois é meu proj de final de curso da facu… e estou sem tempo algum pra mudar parte do meu sistema entendeu?.. a respeito de eu apagar o meu combo…e criar um novo quando eu fizer uma novo busca será que dá certo? como apago ele ?..
se puder me dar uma ajuda nisto agradeço ou me informando um método mais facil e mais rápido pra eu aplicar…
Valeu…

C

O problema deve ser que vc está atualizando o ComboBox mas não está dizendo ao ComboBoxModel que isto aconteceu.
Vc pode fazer assim :

* Remova todos os itens anteriores com removeAllItems()
     * Adicione todos os novos itens, fazendo uma iteração em sua lista de itens ( que deve ser um ArrayList ou mesmo um ResultSet ) usando o metodo addItem().
     * Execute o metodo 
       seuComboBox.ContentsChanged( ListDataEvent e)
       Como vc pode ver esse método recebe um parametro tipo ListDataEvent, entaum vc precisa instanciar um objeto desses assim :
     ListDataEvent event = new ListDataEvent( seuComboBox, ListDataEvent.CONTENTS_CHANGED, 0 , tamanhoDaListaDeItens -1 );
  Isso deve resolver seu problema, caso contrário poste o código relevante para darmos uma olhada.
 E no futuro considere usar o modelo MVC, que ao contrário que possa parecer é mais simples que isso que vc está usando.
D

Então de uma olhada ai no código desta classe ai pra mim…
e desde já muito a obrigado pela força…

import java.awt.event.<em>;

import javax.swing.</em>;

import java.awt.<em>;

import java.sql.</em>;

import java.util.<em>;

import <a href="http://java.io">java.io</a>.</em>;
public class PesquisaPaciente extends JInternalFrame

{

private JLabel LNome,LCod, LTitulo;

private JTextField cod, nomePac;

private Inicio inic;

private JComboBox Pesq, Pes;

private JTextField nomepesq;

private JButton busca;

JRadioButton radio[];

ButtonGroup agrupa;

boolean flag = false;

Vector vetordados;

Connection con;

Statement st;

ResultSet rs;

String Op;

String Escolha = C;

Container container;

public PesquisaPaciente(Inicio ini, String Opcao)

{

super(Pacientes,true,true,true,true);

inic = ini;

Op = Opcao;

container = getContentPane();
this.getContentPane().setLayout(null);

LTitulo = new JLabel();

LTitulo.setText(Escolha uma das Opções para Pesquisa);

LTitulo.setFont(new Font(Times New Roman, Font.BOLD, 14));

LTitulo.setBounds(80,20,350,20);

this.getContentPane().add(LTitulo);

radio = new JRadioButton[2];

ItemHandler handler = new ItemHandler();

radio[0] = new JRadioButton(Codigo,true);

radio[0].addItemListener(handler);

radio[0].setBounds(130,60,70,20);

this.getContentPane().add(radio[0]);
radio[1] = new JRadioButton(Nome);

radio[1].addItemListener(handler);

radio[1].setBounds(220,60,100,20);

this.getContentPane().add(radio[1]);
agrupa = new ButtonGroup();

agrupa.add(radio[0]);

agrupa.add(radio[1]);
LCod = new JLabel(Codigo :);

LCod.setBounds(30,100,80,20);

this.getContentPane().add(LCod);
cod = new JTextField();

cod.setBounds(75,100,40,20);

this.getContentPane().add(cod);
LNome = new JLabel("Nome: ");

LNome.setBounds(30,130,80,20);

this.getContentPane().add(LNome);
nomePac = new JTextField();

nomePac.setBounds(75,130,250,20);

this.getContentPane().add(nomePac);

nomePac.setEditable(false);
ImageIcon icon = new ImageIcon(icon/busca.gif);

busca = new JButton();

busca.setIcon(icon);

busca.setBounds(335,100,80,50);

this.getContentPane().add(busca);

busca.addActionListener( new ActionListener()

{

public void actionPerformed( ActionEvent e)

{

if ( Escolha == C)     //“C” = foi escolhido pesquisa por código

{

if (flag == true) //if true é a segunda pesquisa, carregar  combo

{                      //novamente com novos valores.

Pesq.removeAllItems();

vetordados = pegadados(nomePac.getText(),

integer.parseInt(cod.getText().trim()));

Pesq.addItem(vetordados);

}

else

{

vetordados = pegadados(nomePac.getText(),

Integer.parseInt(cod.getText().trim()));

if (vetordados != null)

{

JOptionPane.showMessageDialog(null,"        Visualizar

dados ?");

criacombo(vetordados);

}

}

}

else if (Escolha == N)         //“N” = foi escolhido pesquisa por nome

{

if (flag == true) //if true é a segunda pesquisa, carregar  combo

{                      //novamente com novos valores.

Pesq.removeAllItems();

vetordados = pegadados(nomePac.getText(),

integer.parseInt(cod.getText().trim()));

Pesq.addItem(vetordados);

}

else

{

vetordados = pegadados(nomePac.getText().trim(), 0);

if (vetordados != null)

{

criacombo(vetordados);

JOptionPane.showMessageDialog(null,"        Visualizar

dados ?");

}

}

}

}

}

);
setSize(435,400);

setLocation(200,50);

}
public void criacombo(Vector dados)

{

Pesq = new JComboBox(dados);

Pesq.setMaximumRowCount(7);

Pesq.setBounds(75,180,250,20);

Pesq.addItemListener(new ItemListener()

{

public void itemStateChanged(ItemEvent event)

{

if( event.getStateChange() == ItemEvent.SELECTED )

{

StringBuffer Item = new StringBuffer(Pesq.getSelectedItem() + “”);

String Codigo =Item.substring(0,3);

inic.PesquisaPacienteCombo(Integer.parseInt(Codigo.trim()),Op);

}

}

});

container.add(Pesq);

flag = true;

}
public Vector pegadados(String nome, int codigo)

{

Vector dados = new Vector();

try

{

con = inic.conexao();

st = con.createStatement();

if (Escolha == C)          //“C” = Codigo.

{

String sql = SELECT * FROM PACIENTE WHERE CODIGOPACIENTE

= " + codigo;

rs = st.executeQuery( sql );

dados.addElement(”                SELECIONE PACIENTE");

if (rs.next())

{

do

{

dados.addElement(rs.getInt(CODIGOPACIENTE) + "    " + rs.getString(NOMEPACIENTE));

}while(rs.next());

}

else

{

JOptionPane.showMessageDialog(null, Codigo não cadastrado);

return null;

}

}

else if (Escolha == N)//“N” = Nome.

{

String sql = SELECT * FROM PACIENTE WHERE NOMEPACIENTE LIKE '”;

sql+= nome + % + “’”;

rs = st.executeQuery( sql );

dados.addElement("                SELECIONE PACIENTE");

if (rs.next())

{

do

{

dados.addElement(rs.getInt(CODIGOPACIENTE) + "    " + rs.getString(NOMEPACIENTE));

}while(rs.next());

}

else

{

JOptionPane.showMessageDialog(null, Nome não cadastrado);

return null;

}

}

}

catch(Exception ex)

{

JOptionPane.showMessageDialog(null,Erro no banco no método peganobanco Pesquisa Paciente);

}

return dados;

}
private class ItemHandler implements ItemListener

{

public void itemStateChanged( ItemEvent event )

{

if ( radio[0].isSelected() )

{

Escolha = C;

cod.setEditable(true);

cod.setText("");

nomePac.setEditable(false);

}

else if( radio[1].isSelected() )

{

Escolha = N;

cod.setEditable(false);

nomePac.setEditable(true);

nomePac.setText("");

}

}

}

}[/color]
D
Ai valeu galera mais já consegui resolver na verdade já estava quase resolvido apenas fiz uma loop na hora de inserir a segunda vez noi meu combovetordados = null;

dados = null;

Pesq.removeAllItems();

vetordados = pegadados(nomePac.getText(), Integer.parseInt

(cod.getText().trim()));
do{
                    Pesq.addItem(vetordados.elementAt(i));
                    i++;
       } while ( i &lt;= vetordados.size());

Ai ficou beleza…
Valeu ai galera e até a minha proxima dúvida…

Criado 8 de novembro de 2003
Ultima resposta 10 de nov. de 2003
Respostas 12
Participantes 5