_004 Aún recuerdo cuando comencé a utilizar componentes en Swing, anteriormente programa las interfaces a mano peleando contra la filosofía de el para que reinventar la rueda, hasta que me canse y decidí ser más eficientes que orgulloso, en fin, fue un cambio por completo para mi, ya que estaba acostumbrado a programar lo que quería a mano, y las interfaces en Swing a mano suelen funcionar algo diferentes a cuando las hacemos con algún asistente, ya que lo mejor es utilizar modelos en un asistente, y al final de cuentas te das cuenta que es más accesible, en esta ocasión, les enseñaré la manera correcta de utilizar un JList de Swing para que puedan manipularlo a su gusto y puedan utilizarlo para acceder a elementos de bases de datos, etc, y sin ningún problema, pero, antes que nada, les enseñaré lo más básico que puede haber con este componente, y es crear un modelo sencillo a mano mediante un método, y hacerle un set al componente para que lo muestre, para esto e hecho lo siguiente, tengo una clase en Netbeans que es un JFrameForm al cual le e agregado un JList sencillo y unas etiquetas para ir procediendo con el ejercicio poco a poco con la intensión de que todo quede sumamente claro: Selección_001   Bien, ahora veamos algo sencillo, mucha gente utiliza el siguiente método par añadirle contenido a un JList, y es necesario tambien que lo aprendamos por una u otra manera, tengan en cuenta que este método lo borraremos posteriormente, lo primero y lo más fácil de hacer a la hora de manipular un JList es crear un método que nos devuelva un modelo para enviarselo posteriormente al JList, para esto harémos un método que nos devuelva un objeto DefaultListModel, objeto al cual le añadiremos elementos en String que querramos que se muestren en la lista: Bien, como verán este método en primera instancia crea un objeto DefaultListModel de Strings, y posteriormente, le agrego manualmente los elementos, ahora, solo nos queda añadir la linea al constructor de la clase del JFrame que le envie el modelo al JList que en mi caso tiene como nombre de variable “lista”. Esto, nos daría como resultado algo como lo siguiente: _002Bien, esta sería una manera muy sencilla de utilizar el JList, pero ¿Que pasa?, ¿Que sucede si lo que quiero que tenga el JList sean los objetos Alumnos o los objetos Personas que yo tenga en una clase a parte, esto no me serviría, por que si yo le envío los objetos al JList este me mostrará las direcciones de memoria, y a la hora de seleccionar un elemento de la lista, yo no podría saber la información de cada uno de mis objetos, y esto es lo que veremos a continuación, primero que nada, borremos el método que hicimos (era solo un test) y borremos la linea del constructor, y lo que haremos, será crear una clase que representará nuestro modelo personalizado, esta clase heredará de AbstractListModel, un objeto que nos permite crear nuestros modelos personalizados para una lista, este nos pedirá la implementación del método getSize y del método getElementAt: También necesitaremos una clase que represente al objeto persona con el cual estaremos trabajando para este ejercicio: Bien, ahora tenemos todo lo necesario para comenzar a trabajar, bien , lo primero que vamos a hacer es trabajar con la clase CustomListModel, y dentro de esta vamos a crear un ArrayList de clase Persona con alcance global, esto lo podemos hacer hasta arriba antes del método getSize sin problemas: Bien, una vez teniendo este ArrayList (que bien se puede llenar con la base de datos en lugar de inicializarse vacio), llenaremos los dos métodos que nos obligó a implementar la herencia de AbstractListModel, y esto es muy sencillo de hacer, el método getSize simplemente devuelve el tamaño completo de elementos en el JList, por consecuente, este tamaño será el mismo que el de la longitud de la lista: En el método getElementAt observaremos primero que nada que recibimos una posición, esta posición normalmente es la que se encuentrar actualmente seleccionada en el JList, por consecuente, será la misma posición del ArrayList, de esta posición, sacaremos el objeto Persona del ArrayList y retornaremos el valor que querramos que se muestre visualmente en el JList: Y listo, teóricamente si tuvieramos datos con esto podriamos mostrar los datos sin problemas, pero que pasa, ya que en nuestra interfaz pusimos que vamos a añadir personas a la lista, no podemos añadir solo el nombre, así que vamos a hacer un método que nos permita añadir un objeto Persona a la lista sin ningún problema ¿va?, el método primero que nada tiene que recibir un objeto persona y posteriormente agregarlo a la lista, pero acá vendrá el chiste, tendremos que notificarle a nuestro modelo, que hemos recibido un dato nuevo y que tiene que actualizar lo que se está viendo en este momento: El método fireIntervalAdded es un método que nos permite notificarle al JList que un elemento ha sido agregado, enviandole un rango de intervalor que en este caso normalmente podemos utilizar getsize() y getsize()+1, datos obtenidos del JList, y listo, con esto estariamos listos, ahora bien, si nosotros quisieramos eliminar un elemento de la lista, necesitariamos un método similar pero que no reciba un objeto, sino solo un indice que sería la posición del elemento seleccionado: Por ultimo, agregaremos un último método, que nos permitirá acceder a los datos de una de las personas simplemente enviandole el indice que tengo seleccionado, para esto haremos algo muy sencillo, agregaremos un método que nos devuelva un objeto persona pasandole el indice: Y bien, yo creo que con esto sería suficiente para la lista, ahora solo nos queda darle funcionalidad a nuestro pequeño programa, y añadir un botón borrar, que se me paso xD … por lo pronto solo les dejo la clase terminada de CustomListModel: Ahora bien, lo único que si les voy a encargar es que le cambien el nombre a las variables que representarán los campos de texto, en mi caso yo les e puesto campo_nombre, campo_apellidos, campo_telefono y para las etiquetas informacion_nombre, informacion_telefono e informacion_apellidos, y con esto, comenzaremos a trabajar: Lo primero que haremos será crear una variable global de nuestro modelo sobre el constructor de la clase del JFrame: Ahora bajo el initComponents del constructor settearemos el modelo para que el JList ya lo tome por defecto desde que arranquemos la aplicación: Bien, ahora a darle doble click al botón para añadirle funcionalidad, y el botón hará algo super sencillo, tomar las variables de los campos de texto y con estas crear un objeto persona que le agregaremos al modelo: Y con esto, tendriamos funcionando la aplicación para agregar personas, algo similar a esto: _003   Bien, ahora vamos a hacer que funcione el  botón eliminar, este será muy sencillo, vamos a darle doble click y a darle funcionalidad: Bien, lo que hace el código anterior es muy sencillo, le pedimos a la lista la posición que tiene seleccionada a este momento, el método getSelectIndex nos devuelve -1 si no hay nada seleccionado, por eso el IF, ahora bien, si hay algo seleccionado, simplemente trabajamos con el modelo y le pedimos que lo retire de la lista, y este automaticamente debe de trabajar, por ultimo agregaremos una ultima funcionalidad, la del hecho de que cuando seleccionemos un elemento de la lista, automaticamente nos muestre toda la información de la persona en la parte de abajo, esto lo haremos de la siguiente manera, desde el modo de diseño de nuestro JFrame, vamos a darle click derecho a nuestro JList, y posteriormente buscaremos el menu eventos, dentro de este, ubicaremos un submenu que dice ListSelection y daremos click al elemento ValueChanged, y veremos que pasa: Netbeans nos envía a un método que se ejecuta automaticamente cuando seleccionamos un elemento de la lista, y bien, este es el que nos permitirá hacer lo que queremos, así en centremonos en que es lo que quisieramos que pase, y lo que quiero que pase, es que dependiendo del que este seleccionado, tomaré un objeto persona ubicado en el mismo indice y mostraré en las etiquetas de información los datos correspondientes, algo muy similar al método anterior, observen: Y listo, con esto tendremos nuestro programa funcionando, super sencillo, fácil y rápido de hacer, claro que lo idoneo es que los datos se vayan agregando a una base de datos y toda la onda, pero es la misma idea. _004

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
  • dld_itz

    muy buen aporte y de mucha utilidad, me fue de mucha ayuda tu infomacion… gracias

    • atxy2k

      De nada para eso estamos, saludos.

  • vbvb

    hola me podrias ayudar?? tengo un boton que agrega un elemento a esta lista pero cada que lo presiono lo sobreescribe alguna idea de porque?

    • atxy2k

      Hola vbvb que tal, claro que si, estamos para ayudar, solo que para esto, me gustaría que pudieses compartir tu código para que podamos observar donde pudiese estar el error.

  • jose

    hola, quisiera saber como se hace para almacenar los datos de un Jlist en una base de datos , esto porque estoy interesado en hacer algo referido a factura o alguna tra idea para realizar una???? gracias de antemano

    • atxy2k

      Jose que tal, buén día, existen muchas maneras en la cual pudieses hacer esto, retomando el modelo anterior como ejemplo, una manera rápida y fácil de implementarlo sería agregandole a la clase Perona un metodo save, que contenga lo necesario para guardarlo en una base de datos, posteriormente, cuando ejecutes el método addPersona del JList, antes de hacer un list.add(p); harías un p.save(), para guardarlo en una base de datos, y listo, super fácil.
      Si tienes algún problema de todos modos comunicate conmigo por correo electrónico y con todo gusto.

  • Rafael Sequeira

    Excelente!!! necesito saber cm harias para guardar esos datos de la persona en un archivo txt gracias

  • kali

    necesito un metodo para buscar.. el que yo tengo me devuelve solo uno de los elementos.. por ejemplo un metodo buscar por nombre, si tengo 2 juan me devuelve solo uno, y para el trabajo que estoy haciendo necesiatria que me devuelvan los 2 alguna ayuda ?

    • Se me ocurren algunas maneras Kali, por ejemplo, manejar una variable boleana que indique que estas buscando, y un ArrayList secundario para guardar las ocurrencias de cada busqueda … por ejemplo, al buscar … cambias esa variable a true y en el array secundario metes todas las ocurrencias de lo que hayas encontrado, así.en el getSize y en el getElementAy … puedes validar … si la busqueda es verdadera, devuelves los datos del array de busquedas … sino … devuelves el del array original, ¿que te parece?

    • Mxrck

      Como dice Ivan, una lista auxiliar para guardar las ocurrencias que encuentres mientras recorres la lista, o si sólo necesitas filtrar el contenido en la lista, puedes usar un filtro http://stackoverflow.com/questions/26271760/filtering-a-jlist-from-text-field-input

  • hermar

    Muchisisisiismas Gracias!, era Justo lo que estaba buscando. No tienes idea de como me ayudó, ademas la manera en que explicas el funcionamiento es increible!

  • Gabriela

    Disculpen, ¿esto es en NetBeans?

    • Si, lo que pasa es que lo ejecutaba sobre Xfce 4.0 … por eso se veía extraño, realmente el IDE es lo de menos, lo que importa es el lenguaje.

  • Luis

    Hola, te podrias pasar el proyecto…

  • Diego Mauricio

    holaaa me podrian ayudar como podria ingresar una foto al JList de la persona que ingreso los datos .. gracias

  • Luis Eduardo Zuñiga Lml

    Me sale un error al meter en el constructor lista.setModel(list_model);
    Que hago???

  • TONY STARK

    Hola Ivan, estoy haciendo un proyecto de una cafetería y tengo problema al guardar un objeto en un jlist, me puedes ayudar?

  • Alan Hernandez

    Hola tengo un problema en el boton eliminar, podrias ayudar?

  • Alan Hernandez

    Hola tengo un problema en el boton eliminar, no se si puedas ayudar porfavor?

  • Rodrigo

    Tiene el proyecto? Ya me perdí como va en orden usando el jlist