Combobox Dinamicas [RESOLVIDO]

26 respostas
M

Tenho minha combobox UF E minha combobox Municipio

queria que ao clicar na combobox UF listar na combobox Municipio apenas os municipios inseridos pela sigla UF

Caso alguem possa me ajudar agradeco abraços.

public BairroEscolherUfAction(JComboBox<Object> ufJComboBox,
			JComboBox<Object> municipioJComboBox, CadastroBairroView view,
			BairroEscolherMunicipioAction view3) {
		super();
		this.ufJComboBox = ufJComboBox;
		this.municipioJComboBox = municipioJComboBox;
		this.municipioService = new DefaultMunicipioService();
		this.view = view;
		this.view3 = view3;
	}



		

	// Evento que da ação a combobox UF
	@Override
	public void actionPerformed(ActionEvent euf) {
		UFVO ufvo = (UFVO) view.getUfJComboBox().getSelectedItem();

		// METODO TRY CATCH EM CASO DE EXECOES JUNTO COM A CONDIÇÃO if e else
		// sendo assim se UF não for selecionado return mensagem

		try {
			
			view.getMunicipioJComboBox().removeAllItems();


			if (view.getUfJComboBox().getSelectedItem() != null) {
				CarregaObjetosnacombo(nome, ufvo);


			} else {

				JOptionPane.showMessageDialog(view, "UF não selecionada");
			}

		} catch (BairroException e) {
			e.printStackTrace();
			JOptionPane.showMessageDialog(view, "erro1");
		} catch (DataBaseException e) {
			e.printStackTrace();
			JOptionPane.showMessageDialog(view, "erro2");
		}

	}
	
	
	

	// metodo responsavel por carregar operacoes no evento Action performed da
	// combobox
	public void CarregaObjetosnacombo(CharSequence nome, UFVO ufvo)
			throws BairroException, DataBaseException {
		ResultSet rs = null;
		PreparedStatement query = null;
		Connection connection = null;
		String sql = null;

		try {

			connection = DataSource.getConnection();

			connection = DriverManager.getConnection(
					"jdbc:mysql://localhost:3306/cliente-db", "impacta",
					"impacta");

			sql = "SELECT nm_municipio,id_municipio ,id_uf FROM municipio";
					
				

			try {

				query = connection.prepareStatement(sql);
				rs = query.executeQuery();

				query.setString(1, String.valueOf(rs.getString("id_uf")));

			} catch (Exception e) {
			}

			List<Municipio> listMunicipios = new ArrayList<Municipio>();
			List<UFVO> listUfvos = new ArrayList<UFVO>();
			
			
					

			while (rs.next()) {
				
		
				Municipio municipio = new Municipio();
				//query.setString(1, String.valueOf(rs.getString("id_uf")));
				
				municipio.setId(rs.getInt("id_municipio"));
				municipio.setNome(rs.getString("nm_municipio"));
				municipio.setUF(ufvo);

				view.getUfJComboBox().addItem(ufvo.isSelecionado());
				
				
				view.getMunicipioJComboBox().addItem(
						rs.getString("nm_municipio"));


				listMunicipios.add(municipio);
				listUfvos.add(ufvo);

		

			}
			for (Municipio municipio : listMunicipios) {
				System.out.println(municipio.getId());	
				System.out.println(view.getUfJComboBox());
				
				if (ufvo.isSelecionado()) {
					view.getMunicipioJComboBox().setModel(new DefaultComboBoxModel<>());
					view.getMunicipioJComboBox().setSelectedItem(municipio.getNome());
					view.getMunicipioJComboBox().addItem(municipio.compareTo(municipio));
					
					
					
				}
				
				if (view.getUfJComboBox().getSelectedItem() == null) {
					view.getMunicipioJComboBox().removeAllItems();
					
				}
				
				/**if (view.getUfJComboBox().getSelectedItem().equals(municipio.getNome())) {
					view.getMunicipioJComboBox().setSelectedItem(rs.getString("nm_municipio"));
					
				}
				
				if (ufvo.equals(municipio.getNome())) {
					view.getMunicipioJComboBox().getSelectedIndex();
					view.getMunicipioJComboBox().removeAllItems();
					
				}
				
				if (view.getMunicipioJComboBox().getSelectedItem().equals(ufvo)) {
					view.getMunicipioJComboBox().removeAllItems();
					
				}
				
				if (view.getUfJComboBox().getSelectedIndex() > 0) {
					
					
				}else if (view.getMunicipioJComboBox().getSelectedItem() == municipio.getNome()) {
					view.getMunicipioJComboBox().removeAllItems();
					
				}*/

		

			}

		} catch (SQLException cause) {
			cause.printStackTrace();
			JOptionPane.showMessageDialog(null, "Não foi possivel Carregar");

		}

	}

26 Respostas

M

Ainda Sigo sem resposta…

RodrigoValentim

Qual erro?
Qual duvida?

Pelo que vi na sua classe, você não filtra a UF selecionada na query.

M

O erro --> não me mostra o municipio Selecionado de acordo com a UF

a duvida --> como filtrar a UF?

RodrigoValentim

Não vejo voce filtrar o id_uf na sua query

Onde esta o where?

sql = "SELECT nm_municipio,id_municipio ,id_uf FROM municipio";
M

Entendi…

Porém eu tinha colocado esse "SELECT nm_municipio,id_municipio ,id_uf FROM municipio"
					+"WHERE id_uf=? ";


Porém quando faço isso da esse erro


Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
	at br.com.impacta.cliente.app.action.bairro.BairroEscolherUfAction.CarregaObjetosnacombo(BairroEscolherUfAction.java:118)
	at br.com.impacta.cliente.app.action.bairro.BairroEscolherUfAction.actionPerformed(BairroEscolherUfAction.java:73)
	at javax.swing.JComboBox.fireActionEvent(Unknown Source)
RodrigoValentim

Mostre a linha
BairroEscolherUfAction.java:118
e
BairroEscolherUfAction.java:73

M
BairroEscolherUfAction.java:118 

while (rs.next()) {






                             BairroEscolherUfAction.java:73

			CarregaObjetosnacombo(nome, ufvo);
RodrigoValentim

Quem e nome?

CarregaObjetosnacombo(nome, ufvo);

Não localizei essa variavel.

M
public void CarregaObjetosnacombo(CharSequence nome, UFVO ufvo)

UFVO é um enum.

e CharSequence é para uma sequencia de caracteres nome

fazem parte do metodo que irá carregar no evento Actionperformed
RodrigoValentim

me refiro a variável nome que voce está chamando para carregar o combo

Essa variável está vindo de onde?

M
agora não é ninguem..

 deixei UFVO ufvo

não tinha sentido deixar ali essa variavel.


 não sei como filtrar a UF agora. para pesquisa
RodrigoValentim

Essa variavel nome esta null e por isso o erro de nullpoint

você precisa passar ela? remove ela do seu metodo e teste.

Bota um breakpoint para ir navegando nos valores e vendoo que esta sendo carregado e não está no modo debug

M
Então .. ja tirei essa variavel.. ela não estava vindo de lugar algum.

 deixei o Enum para referencia de UFs.
M
mesmo tirando essa variavel 

ainda da erro na linha 

while (rs.next()) {
RodrigoValentim

Na linha

} catch (Exception e) {
}

coloque para exibir o stacktrace

M
[color=red]No value specified for parameter 1
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1078)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:989)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:975)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:920)
	at com.mysql.jdbc.PreparedStatement.checkAllParametersSet(PreparedStatement.java:2611)
	at com.mysql.jdbc.PreparedStatement.fillSendPacket(PreparedStatement.java:2586)
	at com.mysql.jdbc.PreparedStatement.fillSendPacket(PreparedStatement.java:2510)
	at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2259)
	at br.com.impacta.cliente.app.action.bairro.BairroEscolherUfAction.CarregaObjetosnacombo(BairroEscolherUfAction.java:108)
	at br.com.impacta.cliente.app.action.bairro.BairroEscolherUfAction.actionPerformed(BairroEscolherUfAction.java:73)[/color]



Diz que nenhum valor foi especificado.. como proceder?
RodrigoValentim

Coloca toda tua classe BairroEscolherUfAction

M
public class BairroEscolherUfAction implements ActionListener,
		Comparator<Bairro> {


	public BairroEscolherUfAction(CadastroBairroView view,
			BairroEscolherMunicipioAction view3) {
		super();
		
	
		this.view = view;
		this.view3 = view3;
	}

	// Evento que da ação a combobox UF
	@Override
	public void actionPerformed(ActionEvent euf) {
		UFVO ufvo = (UFVO) view.getUfJComboBox().getSelectedItem();

		// METODO TRY CATCH EM CASO DE EXECOES JUNTO COM A CONDIÇÃO if e else
		// sendo assim se UF não for selecionado return mensagem

		try {

			view.getMunicipioJComboBox().removeAllItems();

			CarregaObjetosnacombo(ufvo);

		} catch (BairroException e) {
			e.printStackTrace();
			JOptionPane.showMessageDialog(view, "erro1");
		} catch (DataBaseException e) {
			e.printStackTrace();
			JOptionPane.showMessageDialog(view, "erro2");
		}

	}

	// metodo responsavel por carregar operacoes no evento Action performed da
	// combobox
	public void CarregaObjetosnacombo(UFVO ufvo) throws BairroException,
			DataBaseException {
		ResultSet rs = null;
		PreparedStatement query = null;
		Connection connection = null;
		String sql = null;

		try {

			connection = DataSource.getConnection();

			connection = DriverManager.getConnection(
					"jdbc:mysql://localhost:3306/cliente-db", "impacta",
					"impacta");

			sql = "SELECT nm_municipio,id_municipio ,id_uf FROM municipio"
					+ "WHERE id_uf=?  ";

			try {

				query = connection.prepareStatement(sql);
				
				query.execute(sql);
				rs = query.executeQuery();

				query.setString(3, String.valueOf(ufvo));
				
				query.setObject(3, UFVO.valueOf(sql));

			} catch (Exception e) {
				e.printStackTrace();
			}

			List<Municipio> listMunicipios = new ArrayList<Municipio>();
			List<UFVO> listUfvos = new ArrayList<UFVO>();

			while (rs.next()) {

				view.getUfJComboBox().setSelectedItem(rs.getObject("id_uf"));

				Municipio municipio = new Municipio();
				// query.setString(1, String.valueOf(rs.getString("id_uf")));

				municipio.setId(rs.getInt("id_municipio"));
				municipio.setNome(rs.getString("nm_municipio"));

				// view.getUfJComboBox().addItem(ufvo.isSelecionado());

				view.getMunicipioJComboBox().addItem(
						rs.getString("nm_municipio"));

				view.getMunicipioJComboBox().addItem(municipio.getUF());

				listMunicipios.add(municipio);
				listUfvos.add(ufvo);

			}
			for (Municipio municipio : listMunicipios) {
				System.out.println(municipio.getId());
				System.out.println(view.getUfJComboBox());

			}

		} catch (SQLException cause) {
			cause.printStackTrace();

			JOptionPane.showMessageDialog(null, "Não foi possivel Carregar");

		}

	}
RodrigoValentim

Cara, agora e que estou vendo que seu código de conexão e prepareStatement ta uma loucura só.

Da uma lida nesse material

http://docs.oracle.com/javase/tutorial/jdbc/basics/processingsqlstatements.html

Porém, adianto que você precisa aprofundar mais seu conhecimento e entender o que está fazendo.

Exemplo:

  1. Você não pode passar o código de referencia 3 para uma query que tem apenas um parametro

Cada ? na sua query é um parametor, logo, em vez do 3 deveria ter 1

  1. Você tem que preparar toda a query setando seus parametros antes de executar.
  2. seu UFVO é um Objeto, quando você faz o ValueOf é para converter algo, então, olha a loucura

Você está tentando setar um Objeto da sua query toda no Parâmetro 3 da sua query, porém, você só tem um parametro…

Dessa forma, você vai ficar remando e não vai chegar em canto nenhum.

Para você conseguir resolver essa questão… você vai ter que ler o material que postei na url acima e entender.

Poderia facilitar sua vida mostrando o código todo pronto, mas, prefiro dar a vara de pescar e o local da pesca em vez de dar o peixe. Desta forma, vou contribuir mais para seu crescimento profissional

M
Irmão valeu pela força..


 me diz uma coisa.. pq fica dando erro de sintaxe agora?


será que fiz algo diferenciado?


um abraço
ttelsen

Está faltando você ajeitar essa parte do código

query = connection.prepareStatement(sql);  
                  
                query.execute(sql);  
                rs = query.executeQuery();  
  
                query.setString(3, String.valueOf(ufvo));  
                  
                query.setObject(3, UFVO.valueOf(sql));

É por isso que deu esse erro acima [color=red]No value specified for parameter 1

Está faltando vc setar a ‘?’ do PreparedStatement pois ele será o filtro (where) do da sentença SQL.

Algo do tipo

query = connection.prepareStatement(sql);  
                query.setString(1 , uf) // Essa variavel uf vc coloca nela o valor vindo do combo pelo getSelectedItem do combo UF pra poder fazer o where  
                query.execute(sql);  
                rs = query.executeQuery();

Pode não só esse o problema, mas é um deles.

M
Opa amigão consegui resolver..

porém agora me resta uma duvida

a cada select que ele faz acumula uma string na combobox


tem como dar um clear??
RodrigoValentim

Não lembro as propriedades de cabeça, mas, deve existir um combobox.removeAll()

M
entendi..


bom sendo assim vou pesquisar mais

e obrigado pela assistencia.


Forte abraço

logo postarei a solução
M
public void actionPerformed(ActionEvent euf) {
		UFVO uf = (UFVO) view.getUfJComboBox().getSelectedItem();

		try {

			if (view.getUfJComboBox().getSelectedItem() != null) {
				CarregaObjetosnacombo(uf);

			}
			
			
			if (view.getMunicipioJComboBox().getSelectedIndex() >= 1) {
				atualizaCombobox ();
				
			}

		} catch (BairroException e) {
			e.printStackTrace();
			JOptionPane.showMessageDialog(view, "erro1");
		} catch (DataBaseException e) {
			e.printStackTrace();
			JOptionPane.showMessageDialog(view, "erro2");
		}

	}

	private void atualizaCombobox() {
		if (view.getMunicipioJComboBox().getSelectedIndex() >= 1) {
			view.getMunicipioJComboBox().setSelectedIndex(0);
			view.getMunicipioJComboBox().removeAllItems();
		}
		
		
	}

	// metodo responsavel por carregar operacoes no evento Action performed da
	// combobox
	private void CarregaObjetosnacombo(UFVO uf) throws BairroException,
			DataBaseException {
		List<Municipio> listMunicipios = new ArrayList<Municipio>();
		ResultSet rs = null;
		PreparedStatement query = null;
		Connection connection = null;
		String sql = null;

		try {

			connection = DataSource.getConnection();

			sql = "SELECT  nm_municipio,id_municipio,id_uf  FROM municipio"
					+ " WHERE id_uf = ? ORDER  BY id_uf ";

			System.out.println(sql);

			try {

				query = connection.prepareStatement(sql);
				query.setString(1, String.valueOf(uf));

				rs = query.executeQuery();

				while (rs.next()) {

					Municipio municipio = new Municipio();

					municipio.setId(rs.getInt("id_municipio"));

					municipio.setNome(rs.getString("nm_municipio"));

					municipio.setUF(uf);

					view.getMunicipioJComboBox().addItem(
							rs.getString("nm_municipio"));

					listMunicipios.add(municipio);

					

				}

			} catch (Exception cause) {
				cause.printStackTrace();
				JOptionPane.showMessageDialog(view,
						" Não foi possivel carregar " + cause);

			}

		} catch (Exception cause) {
			cause.printStackTrace();
			JOptionPane
					.showMessageDialog(view, "Não foi possivel fazer Select");

		} finally {

			DataSource.close(connection);
		}

	}


BOM  SEGUE SOLUCAO .. CASO ALGUEM TENHA ESSE PROBLEMA ESTÁ AQUI

ABRAÇOS

E OBRIGADO AOS QUE ME AJUDARAM AOS QUE NAO ME AJUDARAM SAIBAM QUE RETORNAREI MAIS FORTE DO QUE NUNCA

=)
ttelsen
markIron:
SAIBAM QUE RETORNAREI MAIS FORTE DO QUE NUNCA

=)

HAHHAHAHAHAHAHAH blz!!! vlws por postar a solução, com certeza vai servir.

Criado 21 de janeiro de 2014
Ultima resposta 29 de jan. de 2014
Respostas 26
Participantes 3