[JAVA] cuadro de texto con sugerencias de búsqueda
-
Estaba haciendo un programa y me ha surgido este problema. El usuario tiene que insertar una serie de datos en varios cuadros de texto, y en algunos de ellos quería facilitarle la tarea. ¿cómo? Fácil, quiero que según escriba en ese cuadro de texto le vayan saliendo sugerencias, posibles cosas que quiere escribir, que se parezcan a lo que está escribiendo.
Buscar "cosas que se parezcan" no es problema, eso simplemente lo busco en la base de datos, el problema es, ¿cómo muestras las sugerencias al usuario? Si es un jtextfield no te da apenas juego...Bien, pues aquí viene la solución que he encontrado y me parece bastante sencilla:
Creamos un JComboBox, es decir uno de esos desplegables. Le hacemos que sea editable (que el usuario pueda escribir dentro).
comboBox = new JComboBox();
comboBox.setEditable(true);
AutoCompleteDecorator.decorate(comboBox);
Y la última línea es la "magia". Pertenece a una librería externa llamada swingX, se puede descargar aquí:
[http://java.net/downloads/swingx/releases/1.6.2/][0]">[http://java.net/downloads/swingx/releases/1.6.2/][1]
Escoged el "swingx-1.6.2-bundle.zip" y dentro del zip viene un archivo llamado "swingx-core-1.6.2.jar" que es el necesario (se añade al classpath y listo, en eclipse proyecto->propiedades->java build path-->libraries->add external jar).
Añadimos el correspondiente import:
import org.jdesktop.swingx.autocomplete.AutoCompleteDecorator;Vale, y ahora para verlo en acción, vamos a hacer que cada vez que el usuario pulse una tecla dentro del jcombobox (es decir, cada vez que escriba algo) se le añada una nueva sugerencia en el desplegable:
editorcomp = (JTextField) comboBox.getEditor().getEditorComponent();
editorcomp.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent arg0) {
comboBox.addItem(editorcomp.getText());
}
});
Como no podemos añadir un listener al combobox en sí (probadlo, no sirve para nada xD), se lo añadimos al "jtextfield que lleva dentro", puesto así entre comillas jeje, pero bueno es eso, obtener el editor y añadirle el listener a él.
Cada vez que el usuario pulsa una tecla, añadimos un elemento al desplegable, cuyo texto es el texto que había nada más pulsar la tecla. Es de prueba, fue lo primero que se me ocurrió jeje.Código final:
comboBox = new JComboBox();
editorcomp = (JTextField) comboBox.getEditor().getEditorComponent();
editorcomp.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent arg0) {
comboBox.addItem(editorcomp.getText());
}
});
comboBox.setEditable(true);
AutoCompleteDecorator.decorate(comboBox);Espero que os sirva, no es complicado pero son dos cosas que no sabía (la librería con el autoCompleteDecorator y el listener en el editor del combobox).
Edito: añado un tercer truco. Dentro del evento, tras insertar/borrar elementos del desplegable, añadid estas dos lineas:
comboBox.hidePopup();
comboBox.showPopup();
Con eso hacemos que el desplegable se repinte, si antes había 1 elemento en el desplegable, y añades digamos 4, queda horrible. Al hacer un hide+show se repinta el desplegable, y aparece con el tamaño adecuado. Y así le ahorras al usuario tener que ocultar y mostrar a mano.[0]: <a href=
[1]: http://java.net/downloads/swingx/releases/1.6.2/ -
Muy buen truco, pero, ¿no sería mejor usar el evento keyReleased para poder trabajar con la información de la última letra escrita también? (es decir, que no vaya con un carácter de retraso), ¿o hay algún inconveniente en esto?
Un saludo! :wiii:
-
sí claro, solamente era un ejemplo, es el primer evento que encontré a mano jeje.
keyreleased o keytyped serían lo adecuado para este caso.EDITO: mentira podrida, keyTyped no es buena idea. A efectos prácticos funciona como el keypressed. Por tanto lo ideal sería como bien dices usar keyReleased