Chave e valor de um combobox [RESOLVIDO]

Olá, esta é minha primeira participação aqui no GUJ. Já o leio quase diariamente, o fórum realmente é muito bom.

Estou desenvolvendo uma aplicação para desktop e agarrei numa parte que não consigo resolver. É o seguinte:

Tenho um sistema de Help Desk em que o atendente vê todos os chamados abertos através de 2 Combobox. Um deles contém o título da solicitação(jCBTitulo) enquanto o outro contém o número da solicitação(jCBNumero). E tenho uma lógica na qual ao buscar por um dos dois combobox, outros campos são preenchidos fazendo um select no banco, onde a cláusula “where” é definida pelo combobox escolhido:

select ... where Titulo = jCBTitulo.getSelectedItem()

ou

select ... where ID_solicitacao = jCBNumero.getSelectedItem()

Na lógica atual, cada titulo cadastrado deve ser diferente (tratamento feito no software). Fiz isso pois quando fazia a busca pelo título e haviam 2 titulos iguais, o resultset buscava 2 resultados, o que não poderia ocorrer.

Preciso de fazer com que ao buscar pelo título, apareça apenas 1 resultado, referente ao que o usuário selecionou, mesmo tendo cadastrado 2 titulos iguais no banco.
Pensei na lógica de haver uma chave (ou um ID) para cada titulo inserido no Combobox (não sei se isso existe na classe JComboBox), fazendo nesse caso que a chave fosse igual ao número da solicitação cadastrado no banco. Tentei usar HashMap, mas não deu certo.

Existe alguma outra solução que vocês podem ajudar?

Obrigado!

Oi,

Poderia utilizar select com distinct… o que acha ?

SELECT DISTINCT <Coluna> FROM <tabela>;

Tchauzin!

Select distinct ...

não funciona pois o campo do título não é chave

Olha só.

Neste trecho você fala que o título cadastrado deve ser diferente.

Agora no trecho abaixo:

Aqui você está falando que quer que apareça somente um resultado, mesmo tendo cadastrado 2 títulos iguais.

Afinal, ele permite ou não ter 2 título iguais no banco ?

Abraço!

criador

Realmente ficou faltando algumas coisas. No banco, o título pode ter 2 valores iguais. Mas atualmente há um tratamento feito no programa que impede que sejam cadastrados 2 títulos iguais. Quero remover esse tratamento, e fazer com que na hora da busca pelo título no software, mesmo que tenham 2 títulos iguais no combobox, seja retornado o título certo, e não somente o primeiro resultado do select. Vou tentar “desenhar” pois realmente está muito difícil de explicar o que eu quero:

Nesse caso acima, imagine que estejam essas atividades cadastradas no banco. Faço um select e jogo todo o resultes em 2 combobox, 1 terá todos os IDs e o outro terá todos os títulos. Qdo faço a busca pelo ID, beleza, puxa todos os dados da tabela corretos, pois o ID é único. Agora, no caso de selecionar pelo título, por exemplo, o “Teste1”, o resultset me retornará 2 valores e não saberei qual dos dois o usuário está querendo. Por isso preciso colocar uma key no combobox do título para cada título adicionado a partir do banco, onde esta key seria igual ao ID da solicitação, e qdo fizesse o select, me retornaria apenas 1 resultado. Melhorou? hehehe

Então você quer que o usuário selecione somente o título e quando for buscar este título no banco, ele retorno o ID referente a este título, mesmo contendo outro título igual na tabela.

É isso ?

Abraço!

criador

Isso mesmo. Tentei usar a classe HashMap mas não consegui. Ouvi dizer que dá para usar a classe Dictionary também, mas esta ainda não testei

Mas na sua aplicação vai aparecer este combobox com os ID’s capturados no banco ou você só fez um exemplo ???
Porque se aparecer, você faz o select com o ID selecionado e o título selecionado.

select * from TABELA where ID = id.getSelectedItem() and TITULO = '" + titulo.getSelectedItem() + "'";

Agora, se você está dando a opção do usuário selecionar somente o título (não poder selecionar o ID), você terá que,
quando receber os dados do select, relacionar cada ID com seu respectivo TITULO.
Acredito que usando um HashMap<Integer, String> você consiga fazer isto.

Abraço!

Tentei usar o HashMap mas não consegui implementá-lo. Estou tentando usar agora o Dictionary. Existe outra classe que possa fazer isso?

Fiz um exemplo usando HashMap.
Porém o problema, é que o método getSelectedIndex() do JComboBox, retorna o índice do primeiro elemento encontrado com aquela string.
Exemplo:

0 - A
1 - B
2 - C
3 - A
4 - D

Se eu selecionar o segundo “A” (índice 3) este método getSelectedIndex() me retorna o índice 0.

Descrição do método no JavaDoc:

[quote]
Returns the first item in the list that matches the given item. The result is not always defined if the JComboBox allows selected items that are not in the list. Returns -1 if there is no selected item or if the user specified an item which is not in the list.

Returns:
    an integer specifying the currently selected list item, where 0 specifies the first item in the list; or -1 if no item is selected or if the currently selected item is not in the list

[/quote].

Se você quiser, posto o meu exemplo para você dar uma olhada.

Abraço!

Se vc puder, agradeceria muito!

package testes;

import java.awt.event.ActionEvent;
import java.util.HashMap;

import javax.swing.AbstractAction;
import javax.swing.JComboBox;
import javax.swing.JDialog;

public class		IndiceComboBox
	extends		JDialog
{
	private			JComboBox
	io_cb;
	
	private			Object[]
	io_ob			=	{"A", "B", "C", "A", "D"};
	
	private			HashMap<String, String>
	io_map			=	new HashMap<String, String>();
	
	private			IndiceComboBox()
	{
		setLayout(null);
		setSize(100,100);
		setDefaultLookAndFeelDecorated(true);
		setLocationRelativeTo(null);
		Window();
	}
	
	private
	void			Window()
	{
		io_cb			=	new JComboBox(io_ob);
		io_cb.setBounds(5,5,80,25);
		io_cb.setAction
		(
			new AbstractAction()
			{
				public
				void			actionPerformed(ActionEvent	ao_evt)
				{
					System.out.println(io_map.keySet().toArray()[io_cb.getSelectedIndex()]);
				}
			}
		);
		getContentPane().add(io_cb);
		
		//
		// Percorre a lista de ítens do combo...
		//
		for	(
				int
				ln			=	0
				;
				ln			<	io_cb.getItemCount()
				;
				ln++
			)
		{
			io_map.put((ln + 1) + io_cb.getItemAt(ln).toString(), io_cb.getItemAt(ln).toString());
		}
	}
	
	public static void main(String[] args)
	{
		new IndiceComboBox().setVisible(true);
	}
}

Neste exemplo, quando você selecionar o segundo “A”, ele não retornará o índice do segundo “A” e sim do primeiro.

Você pode ao invéz de mostrar no combo somente o TITULO, mostrar o ID + TITULO.

Exemplo:

1 - Teste1
2 - Teste2
3 - Teste3
4 - Teste1

Ao selecionar o ítem do combo, você utiliza o método split(" - ") que você terá um array contendo na primeira posição o ID e na segunda o TITULO.

Desta forma você saberá exatamente qual o ID do TITULO selecionado.
Pode não ser a melhor saída, mas é uma saída.

Abraço!

criador

Consegui utilizar o HashMap, mas ele também terá o mesmo problema. O mais correto é colocar o ID junto ao título no combobox mesmo.

Muito obrigado!!

*Nunca fui muito adepto a participar de fóruns, devido à demora em responder, às vezes nem resposta obtive, mas aqui no GUJ estou extremamente satisfeito com a rapidez e o nível técnico das respostas. Meus mais sinceros agradecimentos a todos que ajudaram!

Nao se esqueça se for usar HashMap , sobrescreva hashCode() , e equals() .

Beleza Igor.

É isso aí.

Na verdade, você nem precisa utilizar o HashMap se for colocar no combo o ID e TITULO.
Basta você capturar o ítem relacionado ao índice selecionado no combo.

String[]
id_titulo = io_cb.getItemAt(io_cb.getSelectedIndex()).toString().split(" - ");

if (id_titulo != null) {
      System.out.println("select * from TABELA where ID = " + is_id_titulo[0] + " and TITULO = '" + is_id_titulo[1]) + "'";
}

Assim o seu select estará pronto para ser executado.

Mas se você já resolveu o problema beleza.
Mas tem ainda esta opção caso você queira dar uma estudada.

Abraço!