He creado una página en específico donde mostrar toda la información de la librería, la cual se irá actualizando conforme se hagan cambios o corrijan errores, para ver la información/documentación y descarga entren aquí

Un gran saludo a todos y gracias por sus sugerencias y comentarios.

Cambios con respecto a la versión 1

  • Puedes agregar un conjunto de items (ArrayList) en una sola llamada.
  • Puedes agregar un conjunto de items (Array) en una sola llamada.
  • Puedes eliminar items por referencia de objetos.
  • Puedes eliminar todos los items para evitar que siga apareciendo el autocompletado.
  • Puedes seleccionar un item dando clic en él, y automáticamente se rellenará el JTextField.
  • Puedes obtener el objeto seleccionado actualmente.
  • Se puede verificar la existencia de un objeto por referencia.
  • Se puede verificar la existencia de un objeto por valor.
  • Se puede obtener un objeto buscándolo por valor en la lista de items.
  • Puedes ingresar cualquier tipo de objeto a la lista de items.
  • Puedes generar un callback para el momento en que el usuario seleccione un item y realizar acciones.

Bugs conocidos

  1. Al seleccionar por medio de click algún item el evento callback que es disparado lleva un String en vez del tipo de objeto que se ingresó.

Quizá también te interese

Utilizando ES6 en tus aplicaciones Node
Creando dialogos personalizados en Java con JDIalog
Creando dialogos personalizados en Java con JDIalog
ECMAScript 6, lo nuevo.
Bower, un administrador de paquetes para la web

Mxrck

Ingeniero en Sistemas Computacionales, amante de la tecnología, los videojuegos, la programación. Siempre aprendiendo algo nuevo. "Always Thinking"

  • Pingback: Autocompletar en Java Swing | Ser Programador.es()

  • Nicolás S.

    Buenas noches, no me quedan mas que palabras de agradecimientos hacia vos mi estimado amigo Mxrck, la verdad que hay pocas personas que nos brindan tanta ayuda como lo haces vos. Gracias a tu libreria pude lograr facilitar la busqueda de los datos de mi BD de una manera muy eficiente

    Dejo algo de mi codigo por si a alguien le sirve:

    Metodo para traer alumnos de mi BD:

    public class BaseDeDatos{

    public static ArrayList traerAlumnos(){

    ArrayList listaAlumnos = new ArrayList();

    Alumno alu = null;

    String consulta= “SELECT * FROM alumno alu “;

    try {
    PreparedStatement pst = Conexion.conectar().prepareStatement(consulta);
    ResultSet rs = pst.executeQuery();

    // Conexion es una clase en donde tengo un metodo estatico que hace la conexion de la BD, en este caso el metodo se llama conectar();

    while(rs.next()){

    alu = new Alumno();
    alu.setCodigo_alumno(rs.getInt(“alu.codigo_alumno”));
    alu.setNombre(rs.getString(“alu.nombre”));
    alu.setApellido(rs.getString(“alu.apellido”));

    listaAlumnos.add(alu);
    }

    } catch (SQLException e) {

    System.out.println(“error en mostrar los datos del alumno”+e.getMessage());
    }

    return listaAlumnos; // retorno el ArrayList con los datos de los alumnos

    }
    }

    y el en JFrame hago lo siguiente:

    TextAutoCompleter = new TextAutoCompleter( text_codBusqueda );

    listaAlumnos = BaseDeDatos.traerAlumnos();

    //BaseDeDatos es mi clase donde hago el metodo para traer los datos, y traerAlumnos(); es el metodo q retorna un ArrayList de alumnos

    for( int i = 0 ; i<listaAlumnos.size() ; i++){ // recorro el ArrayList

    TextAutoCompleter.addItem(listaAlumnos.get(i)); // le agrego los elementos
    }

    PD: no se olviden de hacer un @Override en la clase Alumno donde estan todos los atributos de la clase.

    @Override
    public String toString() {
    return this.apellido ;

    }

    De esa manera al escribir una letra en el JTextField de busqueda, se apareran todas las coincidencias con respecto al apellido del alumno.
    Deben haber muchas maneras mas eficientes de hacerlo, pero esa es mi manera.

    Mxrck GRACIAS POR LA LIBRERIA nuevamente.

    Saludos.

  • cabdor

    Saludos, gracias por el aporte. Muy bueno y las mejoras son de gran utilidad

  • Luis Mario Montaño Quirino

    Excelente librería, bastante útil y muy bien programada. Dejo mi siguiente experiencia para prevenir un problema que tuve:
    Las operaciones en el evento Focus_Lost que cambien el contenido del jText ocasionan que la aplicación se congele, al comentar el código todo funcionó a la perfección. específicamente me sucedió al hacer esto: jText.setText(jText.getText.trim())
    Agradezco tu aporte, saludos

    • Mxrck

      Muchas gracias por el feedback, ya que sirve para continuar las mejoras y solucionar los problemas.

      Unas cuantas preguntas sobre el error:

      ¿Lanza alguna excepción o solo se queda completamente congelado?
      ¿Se está mostrando el popup de autocompletar en el momento del evento o es indiferente?

      Saludos.

  • Alberto

    Hola Amigo! Muchas gracias por el aporte. Llevo un tiempo trabajando ya con tu primera versión del “Autocomplete”, y estaba esperando por la mejora de poder autocompletar el textfield al hacer click en un elemento. En esta segunda versión veo que comentas que has añadido esta funcionalidad, pero la he probado y sigue sin funcionarme, solo se despliega la selección al pulsar “enter”. Podrías comprobarlo? Gracias!

  • John C.

    Saludos y Gracias por compartir tu librería que por cierto me fue de mucha ayuda, la pregunta es, si es posible trabajarla en un jTable, por ejemplo, para el llenado de una tabla, escribir en una celda el proveedor y que me autocomplete el nombre en la misma celda, esperando tus comentarios me despido

    Que tengas un buen dia

    • Mxrck

      Por ahora no es posible, aunque una probable solución que se me ocurre ahora es poniendo directamente un JTextField en la celda, pero no estoy seguro que funcione al 100%.

      Saludos

  • HENRY

    amigo interesante libreria, necesito de tu ayuda. Necesito obtener el ID seleccionado de una lista de nombres obteneidos BD. pero me muestra el si siguiente error:

    “local variables referenced from an inner class must be final or effectively final” EN LA SOGUIENTE LINEA DE CODIGO:

    selectedItem = textAutoCompleter.getItemSelected();

    ================================================================

    private void busquedaclientes(){

    TextAutoCompleter textAutoCompleter = null;

    textAutoCompleter = new TextAutoCompleter(clientejTextField, new AutoCompleterCallback() {

    @Override

    public void callback(Object selectedItem) {

    selectedItem = textAutoCompleter.getItemSelected();//AQUI ME MUESTRA EL ERROR

    System.out.println(“El usuario seleccionó: ” + selectedItem);

    }

    });

    textAutoCompleter.setMode(0);

    textAutoCompleter.setCaseSensitive(false);

    for (Clientes c : ClienteDao.listarCliente()) {

    textAutoCompleter.addItem(new Autocomplete(c.getPersonas().getNombres(), c.getId()));

    }

    }

    • Mxrck

      Que tal, disculpa por responder tan tarde, he estado algo ocupado.

      Bien, en la línea que tienes el error no necesitas hacerlo de esa forma, ya que al ejecutarse la función no necesitas hacer:

      La corrección de tu caso específico sería algo similar a esto:

      Ya que “selectedItem” es de hecho el item seleccionado.

      Un saludo.

  • Jose

    Men en esta parte desde mi punto de vista creo que es mejor usar tipos de datos genéricos , un solo constructor te serviría.

    Quedaría asi añadir:

    public void i(E items[]){
    ………
    }

    Para obtener aplicas en mismo concepto.

    • Mxrck

      Hola que tal, lo tomaré en cuenta. un saludo.

    • Rick Emanuel Rozo Sevilla

      Si es muy buena idea! 😀

  • Jose Carlos

    Buenos Días Mxrck, excelente el trabajo que realizaste y felicitarte por compartirlo, aqui va mi pregunta, como puedo hacer para que al seleccionar con un click pueda tambien obtener la edad de la persona, por que con el AutoCompleterCallBack solo recupero el nombre, y cuando selecciono con el enter en ahi si puedo recuperar el nombre y la edad, me gustaria que me ayudes como podria hacer para que al seleccionar con un click tambien pueda recuperar el nombre y la edad de la clase Persona. Gracias!

    • Mxrck

      Hola que tal, echaré un vistazo ya que parece que eso es un error. saludos.

  • Mario Salazar

    oye amigo se me congela mi apicacion cuando hago clik en la caja de texto no se que es lo que falle este es mi codigo, si funciona y si me muestra mis opciones pero se hace demasiado lento y en un momento se queda trabado, no manda excepciones

    public void autocompletarproducto(){

    TextAutoCompleter textAutoAcompleter = new TextAutoCompleter( jTextField8 );

    textAutoAcompleter.setMode(0);

    try{

    sql=”SELECT nombre FROM Producto”;

    sentencia=conex.createStatement();

    resultados= sentencia.executeQuery(sql);

    while(resultados.next()){

    textAutoAcompleter.addItem(resultados.getString(“nombre”));

    }

    en el constructor del jframe mando llamar el metodo (tambien intente mandandolo llamar con el evento focus, es decir cuando den clik en la caja de texto y tampoco funciono)

    public Compras() {

    initComponents();

    autocompletarproducto();

    }

    agradeceria mucho tu ayuda, gracias por todo amigo

    • mario salazar

      listo ya lo solucione, solo deben de mandar llamar autocompletarproducto(); desde otra clase o frame

    • Mxrck

      Esto te daría problemas en 2 situaciones.

      1.- En el caso de que llames a tu función “autocompletarproducto();” varias veces durante la ejecución de tu programa.
      2.- En el caso de que tu base de datos sea demasiado grande.

      Para el primer caso recomiendo controlar un poco más el ingreso y eliminación de items, ya que al llamar la función muchas veces, lo llenarías con items repetidos en varias ocasiones.

      Para el segundo caso y veo que a la mayoría le está pasando, recomiendo controlar las llamadas a la base de datos, ya que no es bueno llamar o seleccionar todos los registros de una tabla, esto por problemas de recursos de la aplicación en general, recomiendo manejar paginación e ingresar los items a petición conforme se ingresen caracteres en el campo (tal como funcionan los autocompletadores en web).

      Un saludo y que bueno que has solucionado tu problema.

      • Marivi

        Me pasa algo similar yo tengo un evento de buscar en varias tablas de mi BD… Me explico mejor…
        tengo 4 tablas y en todas busco por la fecha y uso el autocompleter… pero cuando llamo a la funcion de autocompletar varias veces con tablas diferentes y la fecha en la ejecucion del programa no se eliminan los Item de la tabla anterior y esto me causa problemas… como se soluciona esto.

        • Mxrck

          Revisaré, probablemente alguno de los métodos para eliminar tiene un error.

  • Fernando

    Mxrck, que tal. Antes que nada agradecer tu aporte en la construcción de esta funcionalidad que en verdad es muy útil.
    Hace unos días he usado la funcionalidad del autocompleter en algunos proyectos y con lo que he observado del mismo, quisiera hacerte algunas sugerencias.
    1) A mi parecer, deberías ir pensando en genéricos. Es mucho más flexible (y seguro), de tal forma que si sabes que desde un principio trabajas con una lista de objetos de un tipo específico, al obtener su valor (cuando devuelves el valor seleccionado) será del mismo tipo (Adiós casting).
    2) Hay un dicho que reza: “No programes para implementación, programa para interfaces”. Caso puntual: el ArrayList que tienes como parámetro de entrada para agregar listas de items. ¿Por qué no trabajar con sus super clases de tal forma que se admitan cualquier tipo de colecciones? Sería mucho más extensible y obviamente aplicando tipos genéricos. (p.e: addItems(List list) o addItems(Collection list)). Das mayor libertad al programador.
    O muuucho mejor, podrías aplicar de una vez genéricos a tu superclase abstracta y extender de ella. p.e AbstractAutoCompleter.
    3) Una funcionalidad que deberías agregar a parte de la de casos sensitivos entre mayúsculas y minúsculas es la de caso sensitivo de acentos p.e Mas – Más, pues actualmente no está soportada.
    4) y por último mi estimado, Tu proyecto en verdad que es muy bien acogido, fácil e intuitivo de trabajar. Es un gran aporte, en verdad. Por lo mismo pienso que el trabajo no para aquí, hay que seguir con su desarrollo.
    Personalmente me gustaría que compartieras el código fuente, o más bien que liberaras tu código fuente bajo una licencia GPL en aras de promover el trabajo colaborativo y que así, personas como tú o como yo podamos dar nuestros aportes en el mejoramiento de esta librería. Espero que pienses mucho en este último punto, no estás solo mi estimado. 🙂
    Sin más por el momento. Gracias!

    • Mxrck

      Hola que tal, muchas gracias por el comentario, de hecho muchas de las cosas siguen de esa forma porque quería que siguiera siendo “compatible” con la mayoría de funciones que se programaron de inicio, aunque al final me terminé alejando un poco de todas formas.

      En todos tus puntos tienes razón y lo tomaré en cuenta, de igual forma esto era solo una versión beta que hice precisamente porque me pedían algunas de las funciones implementadas, ya que tenía mucho tiempo que no tocaba ni actualizaba, de hecho le había comentado a otra persona que si no me animaba a actualizar probablemente liberaría el código.

      Aún sigo pensando en ello de todas formas, pero por ahora no estoy totalmente seguro, pero si que lo estoy pensando.

      Un saludo.

  • Paty Arakawa

    Cuesta descargar la librería? Porque automáticamente el link me lleva a una página con costo de suscripción y todo ello.

    • Mxrck

      Es completamente gratis amiga, el enlace envía a adfly que solo es publicidad, arriba a la derecha hay un botón de saltar publicidad, luego te envía a mediafire para que la puedas descargar.

      La ultima versión la puedes ver aquí, ya que esta tiene un pequeño bug

      http://serprogramador.es/autocompletar-java-swing-autocompleter/

      • Paty Arakawa

        Me logueo a MediaFire y me sale esta ventana:

        • Mxrck

          Es verdad, ya recordé, el archivo lo borré porque tenía un bug esa versión de la librería, en la respuesta anterior te puse el enlace de la versión ya corregida.

          Saludos.

  • JhamRC

    Hola que tal, antes que nada felicitarte por compartir esta util libreria, y comentarte que es la primera vez que la utilizo; ya que soy usuario MacOS X te comento que presenta una falla al momento de escribir en el JTextField, pues me sombrea la primera letra que escribo y si continuo escribiendo la segunda letra sobrescribe a la primera, por ejemplo si quiero escribir HOLA al momento de escribir la H me la sombrea y al continuar escribiendo, la O sobrescribe a la H y la palabra queda escrita así : OLA . Nose si en Linux tambien existe ese error, pero ya que JAVA es multiplataforma me es curioso que solo funcione bien en Windows. Espero haber ayudado en la optimizacion de tu libreria… Saludos.

    • Ivan Apud

      Me pasa exactamente lo mismo y no se como solucionarlo, en Windows funciona perfecto, ojala pronto tengamos una version con este fix 🙂

  • Giovanny Caldera

    cuando lo agrego de la paleta me sale esto

    Exception in thread “AWT-EventQueue-0” java.lang.NullPointerException
    at com.mxrck.autocompleter.AutoCompleter.(SourceFile:97)
    at com.mxrck.autocompleter.TextAutoCompleter.(SourceFile:22)
    at Pruebas.eventoKey.(eventoKey.java:17)
    at Pruebas.eventoKey$2.run(eventoKey.java:151)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:749)
    at java.awt.EventQueue.access$500(EventQueue.java:97)
    at java.awt.EventQueue$3.run(EventQueue.java:702)
    at java.awt.EventQueue$3.run(EventQueue.java:696)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:719)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
    BUILD SUCCESSFUL (total time: 1 second)

    • Mxrck

      Esta librería no se agrega a la paleta de componentes swing, solo debes agregarlo a tus librerías e inicializarla tal cual como está en la explicación.

      Saludos.

  • Luis Oyanguren

    buenos dias que tal, como puedo hacer que despues de ejecutar el calback mi textbox se quede en blanco de nuevo para hacer otra busqueda?? usando un boton ??

  • Pingback: Autocompletar en Java Swing v2.0.1 (beta) | Ser Programador.es()