jComboBox com preenchimento dinamico

Estive pensando se algum meio de fazer isso:
se eu digitar…‘ab’ em um combobox editavel…ele vai me listar ‘abc’,‘abelha’,‘abusado’…sendo que esses dados estao no bd…
eu acho que retornar o valor da coluna deve ser assim:

public String[] listaNC(String cliente){ 
String[] nm_cliente=new String[this.nRegID()]; 
try{ 
stmt=conect.getStatement(); 
ResultSet rs= 
stmt.executeQuery("select nm_cliente from sis_cad_clientes where nm_cliente='"+cliente+"%"); 
int i=0; 
while(rs.next()){ 
String nome=rs.getString("nm_cliente"); 
nm_cliente[i++]=nome; 
} 
}catch(SQLException ex){ 
System.out.println(ex); 
} 
return nm_cliente; 
} 

onde o parametro nome eh o texto que vc digitou dentro da combo…
agora a acao da combo eh que sao outros 500…alguem pode me ajudar…quem sabe a gente faz uma interface swt bem show com bd e disponibiliza de tutorial no site…

A ideia eh boa, mas eu tenho 2 consideracoes…

1a. A tabela dever conter poucas informacoes, ou entao ficaria muito lento cada vez q se digitasse um caracter na combo.

2a. Caso a afirmativa anteriror seja verdadeira, popula uma lista com ela na inicalização do programa, entao, qd o usuario estiver digitando vc faz a busca na lista, e nao na base a todo momento…

Caso a 1a. consideracao seja falsa, acho isso inviavel pelo fato de se ter q buscar na base o tempo todo!

E se fazer esperar um tempo depois da digitação pra buscar?

Tipo, digita: AB, depois de meio segundo de digitado a ultima letra ai sim vai buscar…pelo menos nao busca pra cada letra digitada… a nao ser que o usuario seja o super lerdo.

[quote=“danieldestro”]E se fazer esperar um tempo depois da digitação pra buscar?

Tipo, digita: AB, depois de meio segundo de digitado a ultima letra ai sim vai buscar…pelo menos nao busca pra cada letra digitada… a nao ser que o usuario seja o super lerdo.[/quote]

Por isso eu fiz aquelas consideracoes

Preciso de um componente para mostrar dados naquelas configuracoes que falei…senaum for um combox o que poderia ser???
vcs tem ideia???exemplo???

Trata isso no evento KeyPressed ou KeyReleased do JComboBox.

Eu fiz isso com javascript, não ta la a melhor coisa, mas funciona bem.

Funcionava mais ou menos da seguinte maneira:

  • Um <select> preenchido com os dados do resultSet
  • Um que servia como campo de busca
  • Toda vez que o usuário digita uma letra (ou backspace), o código faz o filtro novamente. Ao selecionar algum item, um input já é preenchido com o conteudo.

Segue parte do código

// filtra o select baseado nas letras digitadas
// @params
// o select e o field para digitar a busca
function fldSearchSearch_onkeyup&#40; slc, fldSearch &#41;
&#123;
	if&#40; event.keyCode == 27 &#41; //esc
		event.srcElement.parentElement.style.visibility = 'hidden';

	var slc = document.getElementById&#40; slc &#41;;
	var fldSearch = document.getElementById&#40; fldSearch &#41;;
	
	// o valor atual do campo de busca
	var strValor = fldSearch.value.toUpperCase&#40;&#41;;
	slc.innerHTML = &quot;&quot;;
	var opt;
	
	
	// preenche o array optTodos com um array previamente preenchido
	// com os dados da busca no banco de dados
	optTodos = new Array&#40;&#41;;
	if&#40; slc.id == 'slcIdiomas' &#41;
		optTodos = optIdiomas;
	else if&#40; slc.id == 'slcInformatica' &#41;
		optTodos = optInformatica;
	else if&#40; slc.id == 'slcEspecialidades' &#41;
		optTodos = optEspecialidades;
	else if&#40; slc.id == 'slcPosgraduacao' &#41;
		optTodos = optPosgraduacao;
	else if&#40; slc.id == 'slcFuncoes' &#41;
		optTodos = optFuncoes;
	else if&#40; slc.id == 'slcDocs' &#41;
		optTodos = optDocs;

	if&#40; event.keyCode == 40 || event.keyCode == 9 &#41;
		slc.focus&#40;&#41;;
		
	if &#40; strValor == &quot;&quot; &#41; 
	&#123;
		for&#40; var i = 0; i &lt; optTodos.length; i++ &#41;
		&#123;
			opt = document.createElement&#40;'OPTION'&#41;;
			opt.value = optTodos&#91; i &#93;&#91; 1 &#93;;
			opt.innerHTML = optTodos&#91; i &#93;&#91; 0 &#93;;
			slc.appendChild&#40; opt &#41;;
		&#125;
	&#125;
	else
	&#123;
		for&#40; var i = 0; i &lt; optTodos.length; i++ &#41;
		&#123;
			if&#40; optTodos&#91; i &#93;&#91; 0 &#93;.toString&#40;&#41;.toUpperCase&#40;&#41;.indexOf&#40; strValor &#41; == 0 &#41;
			&#123;
				opt = document.createElement&#40;'OPTION'&#41;;
				opt.value = optTodos&#91; i &#93;&#91; 1 &#93;;
				opt.innerHTML = optTodos&#91; i &#93;&#91; 0 &#93;;
				slc.appendChild&#40; opt &#41;;
			&#125;
		&#125;
	&#125;
	fldSearch.style.width = slc.offsetWidth;
&#125;


// preenche o input dependendo das teclas digitadas
// @params
// o select, o input para ser preenchido quando faz uma escolha, o input oculto para preencher o id
// o field, com search e o formulario
function setInput&#40; slc, inpt, idinpt, fldSearchSearch, fm &#41;
&#123;
	if&#40; event.keyCode == 27 &#41; //esc
		event.srcElement.parentElement.style.visibility = 'hidden';
		
	var form = fm;
	var selectedIndex = slc.selectedIndex;
	
	var idInpt = null;
	
	for&#40; var i = 0; i &lt; form.elements.length; i++ &#41;
	&#123;
		if&#40; form.elements&#91; i &#93;.id == inpt &#41;
			inpt = form.elements&#91; i &#93;;
		else if&#40; form.elements&#91; i &#93;.id == idinpt &amp;&amp; idInpt == null &#41;
			idInpt = form.elements&#91; i &#93;;
	&#125;
	
	var fldSearchSearch = document.getElementById&#40; fldSearchSearch &#41;;
	
	// KEY_ENTER
	if&#40; event.keyCode == 13	&#41;
	&#123;
		inpt.innerText = slc.options&#91; selectedIndex &#93;.text;
		if&#40; idInpt != null &#41;
			idInpt.innerText = slc.options&#91; selectedIndex &#93;.value;
		searchString = &quot;&quot;;
		slc.parentElement.style.visibility = 'hidden';
	&#125;
	// Seta para baixo
	else if&#40; event.keyCode == 38 &amp;&amp; slc.selectedIndex &gt; 0 &#41;
	&#123;
		inpt.innerText = slc.options&#91; selectedIndex - 1 &#93;.text;
		if&#40; idInpt != null &#41;
			idInpt.innerText = slc.options&#91; selectedIndex - 1 &#93;.value;	
	&#125;
	else if&#40; event.keyCode == 38 &amp;&amp; slc.selectedIndex == 0 &#41;	
		fldSearchSearch.focus&#40;&#41;;

	// seta para baixo
	else if&#40; event.keyCode == 40 &amp;&amp; slc.selectedIndex &lt; slc.length - 1 &#41;
	&#123;
		inpt.innerText = slc.options&#91; selectedIndex + 1 &#93;.text;
		if&#40; idInpt != null &#41;
			idInpt.innerText = selectedIndex &gt;= 0 ? slc.options&#91; selectedIndex + 1 &#93;.value &#58; '';
	&#125;
	else
	&#123;
		inpt.innerText = slc.options&#91; selectedIndex &#93;.text;
		if&#40; idInpt != null &#41;
			idInpt.value = slc.options&#91; selectedIndex &#93;.value;
		searchString = &quot;&quot;;
		slc.parentElement.style.visibility = 'hidden';
	&#125;
&#125;