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…

R

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?

R

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)
R

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

M
BairroEscolherUfAction.java:118 

while (rs.next()) {






                             BairroEscolherUfAction.java:73

			CarregaObjetosnacombo(nome, ufvo);
R

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
R

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
R

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()) {
R

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?
R

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");

		}

	}
R

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
T

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??
R

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

=)
T
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