JComboBox y Beans Binding


ACTUALIZACIÓN:

Al momento de escribir éste post, la versión disponible de beans binding era la 0.5, por su número de versión podemos decir que dicho API se encontraba en desarrollo, por tal razón y con la salida de la versión oficial (versión a partir del 1) se han tenido varios cambios que hacen imposible que éste ejemplo trabaje según lo inidicado. Les recomiendo que trabajen con la última versión de beans binding. Pero no todo está perdido revisando en la Web y en blog de Patrick Keegan existe un ejemplo que no enseña cómo debemos hacerlo ahora; les comparto el link

En éste post he construido una aplicación que carga y muestra datos en un JComboBox, pero utilizando una solución diferente a la que planteé en un post anterior, pero la misma finalidad, una vez que se selecciona un valor en el combo necesito conocer el id (no el índice) del valor seleccionado, así como los combos de visual fox.

Demo

Para ésta nueva aplicación utilicé los Beans Binding, una nueva especificación de Java que permite tener sincronizados 2 Beans. Parte del código de la misma explicaré en las siguientes líneas.

En primer lugar tengo una clase (Primer Bean) que se llama Periodo que tiene 2 atributos tipo String id y nombre, y los métodos set y get para cada uno de ellos, además un constructor que permite crear objetos de la clase Periodo inicializando ambos parámetros.

Clase Periodo

La clase periodo será la que alimente de valores para el combo.

Tengo un formulario en donde se dibujan 2 etiquetas y 1 combo. Una de las étiquetas presenta el id del valor seleccionado en el combo.

Para utilizar los Beans Binding es necesario descargar el archivo beansbinding-0.5.jar e incluirlo dentro del proyecto de NetBeans. El código que permite crear objetos de la clase Periodo se encuentra en el método crearPeriodos() definido dentro del JFrame, los periodos creados son asignados a la propiedad periodos que es un objeto de la clase List.

Método que crear los objetos Periodo

Para asociar los valores de la lista de periodos al combo(2do Bean) es necesario utilizar Beans Binding en donde se puede ver que se hace uso de la EL (Expression Lenguage) para hacer referencia a los atributos de la clase Periodo, aquí el código:

Método que carga los datos al combo

Los parámetros de la línea 94 señalan que cuando se seleccione un valor del combo se debe seleccionar el atributo id de la clase Periodo. Existe otra manera (código comentado)de configuración en donde se señala que el objeto seleccionado no será un atributo sino todo el objeto.

El trabajo con los Beans Binding es de la manera fuente destino y podemos ver en la línea 93 como el origen de los datos es el ArrayList periodos y el destino es el combo (cbxPeriodos) y se señala que cada objeto que se encuentra en el ArrayList será un elemento (elements) del combo. Se llama al método bind para que tenga efecto las configuraciones anteriormente hechas.

La línea 95 dice que el atributo que debe presentar el combo es el atributo nombre que se encuentra en la clase Periodo.

Luego se crea un segundo bind en donde el origen es el combo, el valor seleccionado (en éste caso el id del periodo seleccionado) y el origen es una etiqueta (lblIdPeriodo 3er Bean) en su propiedad text.

Con ésto se logra el mismo efecto que en el post anterior, pero simplificado, debido a que no se debe programa el evento actionPerformed y son los Beans Binding se encargan de hacer la sincronización.

Dentro del método cargarPeriodos existen algunas líneas comentadas que muestran la segunda manera de configurar los elementos del combo y sincronizarla en éste caso con una propiedad de la clase actual (JFrame) que se llama periodoSeleccionado.
Como nos podemos dar cuenta en la especificación del Bean Binding, éste aún se encuentra en desarrollo y me imagino que la primera versión verá la luz con el lanzamiento de NetBeans 6.0, esto lo digo ya que NetBeans.

39 comentarios en “JComboBox y Beans Binding

  1. Plutarco dijo:

    Estoy haciendo u proyecto para un trabajo en Universidad y debo hacer la Bd en Oracle y pagina Web en Netbeans, ya consegui conectar a la base por medio de una libreria, pero no puedo generar consultas des la pagina, , este es el codigo de una isercion y me genera un eroro, porfavor salveme la patria necesito el codigo paa hacer actualizaciones, insercione, consultas y borrado desde netbeans a la bd.

  2. rony dijo:

    Hola amigo sabes use tu codigo para poder enlazar una lista de peridos pero no me funciona me podrias ayudar para almecenar el id en una variable que es le de qse necesita finalmente

  3. Hola,

    En la segunda figura en la línea 94, se especifica que cuando se seleccione un valor del combo el valor que debe devolver es el atributo id del objeto seleccionado. Si gustas puedes enviarme mayores detalles para poder ayudarte de mejor manera.

  4. rony dijo:

    amigo si reporta en el combo y todo pero no muestra el id en el JLabel, una consulta mas puede funcinar con el JList lo prpobe y si cargo los datos pero necesit o que ese ID se muestre

  5. Amigo,
    Cuando hice el ejemplo el atributo id tuve que cambiarlo a String debido a que los JLabel no presentan tipos de datos numéricos sin hacer una transformación previa, posiblemente por ahí se dé el problema,o si puedes incluir algo de código será mejor.

    Con JList no le he probado, pero dentro del JavaDoc de los Beans Binding puedes encontrar información de cada una de las propiedades que soportan los componentes de Swing.

    Espero que sea de tú ayuda.

  6. rony dijo:

    upps recien llego a mi trabajo si debes tener razon con lo de la propiedad String, pero ahora dime ese valor Id lo podre obtener en algna variable

  7. rony dijo:

    si amigo tienes mucha razon pero dime ahora a habra alguna formna de que el ID que geralmente es int almacenarlo en alguna variable si sabes alguna forma me podrias avidsar porfavorrrr

  8. Claro que sí existe una forma, debes declarar un atributo tipo int en tú contenedor (si es tú caso un JFrame), le creas los métodos get y set y el binding reemplazas la etiqueta, por una referencia al JFrame (puede ser this) y ubicas el nombre de la propiedad en lugar de la propiedad text del JLabel, creo que eso debería funcionar.

  9. rony dijo:

    claro si hermano tienes mucha razon funciona dejame aportar en el tema con el codigo para el JList con JLabel
    ArrayList datos = AreaDAO.getInstance().listar();
    Binding binding = new Binding(datos,null,lstAreas,”elements”);
    binding.addBinding(“${nombre}”,null);
    binding.bind();
    binding = new Binding(lstAreas,”${selectedElements.codigo}”,lblArea,”text”);
    binding.bind();
    codigo y nombre es un atributo de la clase Area
    Bueno a mi criterio esta muy bueno esto lo que pàsa es que yo kiero hacer mas locuras con el JList kiero seleccionar multiplemente y ke pueda ser adicionado en una lista todos estos codigos para su posterior manejo si me podrias yaudar en esto te lo agradeceria hermano

  10. iberck dijo:

    Hola jorgaf,
    Tengo una duda, no se si me puedas ayudar
    hay circulando un demo (http://www.netbeans.org/download/flash/netbeans_6_gui_builder/netbeans_6_gui_builder.html)
    donde hacen el binding entre la base de datos y los componentes swing, aqui la tecnica de persistencia es ejb 3.0 si no me equivoco.
    La pregunta es si ocupan la misma libreria de databinding (JSR 295) que muestras en los ejemplos y si es así, ¿se puede ocupar esta librería de databinding con tecnicas de persistencia distintas a EJB 3.0?

    Pd. si gustas puedes agregarme a tu lista de contactos

    Gracias de antemano
    SCJP 1.4
    SCJP 1.5
    SCWCD in progress

  11. Hola iberck,

    De lo que conozco (por las presentaciones del Java One), sí NetBeans está trabajando con Beans Binding(JSR 295) para crear sus aplicaciones con base de datos. Como te debes haber percatado, los beans binding son independientes del mecanismo de persistencia, únicamente permiten trabajar con colecciones de datos y componentes Swing de una mejor manera. En mi caso he probado utilizando JPA en lugar de EJB3.0

    Y sí los ejemplos que presenté son de la especificación: JSR 295

  12. iberck dijo:

    gracias por la respuesta, el soporte para cualquier mecanismo de persistencia esta soportado por netbeans ? Tal vez mi origen de datos es un simple datasource y quiero ligarlo con mis componentes … es posible ??

  13. Jorge dijo:

    En NetBeans + adicionales se puede trabajar con varios mecanismos de persistencia. El Datasource debe ser un Java Bean para poder ligarlo a los componentes.

  14. aurora dijo:

    hola me gustaria que me ayudes… tengo unos problemas
    1. tengo en internalframe 2 paneles en un de ellos tengo una lista escojo un objeto y lo modifico en el otro panel pero los datos del combobox no se me modifican.. como puedo hacer para que cuando pulse modificar se me presente en el combo la informacion del objeto…
    2. estoy utilizando hibernate y spring tengo una relacion de muchos a muchos y cuando quiero guardar no se me guarda la relacion.
    3. y como puedo poner en una tabla un jcombobox

    les agradezco la ayuda

  15. Hola,

    Te comento, en tu primer punto, no he realizado pruebas para seleccionar el valor de un combo utilizando Beans Binding, trataré de hacer algo rápido y te comento.

    En tu segundo punto, no he trabajo con Hibernate, alguna vez intenté hacer algo, pero me perdí al crear los archivos xml.

    Para poner un JComboBox dentro de una tabla se deben utilizar Render para decirle a la tabla que el componente que se va a mostrar es un combo, creo que tengo algún código por ahí que te puede guiar. Haré un post sobre el tema.

  16. Kenny dijo:

    Disculpa amigo, usé tu ejemplo y me funciona perfecto, el problema lo tengo cuando quiero el valor del ID no en el Jlabel sino usar una variable del Frame podrías indicarme como hacerlo?

  17. Hola Kenny,
    No he realizado muchas pruebas, pero creo que deberías crear una propiedad para el JFrame con el que trabajas, eso implica tener métodos set y get. Luego configuras el Binding para dicha propiedad. Trataré de hacer algo y te comento.

  18. Hola Jorge, gracias por reponder, oye estuve probando lo que me dijiste inclusive con una clase para setearle el valor a una propiedad pero mi problema es que no sé como cambiar la configuración del binding, si tienes información al respecto te la agradecería, gracias nuevamente

  19. patricia dijo:

    oye muy bueno tu articulo…

    pero me gustaria hacerte una pregunta, mira lo que sucede es que tengo una dependencia entre combox, es decir dependiendo de lo que selecciono en el primer combo se llena el segundo combo, pero al hacer esto se me esta perdiendo el ID cuando se refresca la pagina. No se si con los binding yo podria mejorar esto.

  20. Hola Wilfredo,

    Te comento que hace algún tiempo estuve buscando esa librería porque un compañero de trabajo me dijo que tenía problemas. Bueno resulta que como BeansBinding era en esos días un API en desarrollo estuve trabajando con versión beta o algo así, y hoy por hoy ha cambiado y es necesario cambiar lo que tengo escrito. Aquí puedes encontrar cómo lo podrías hacer ahora: http://weblogs.java.net/blog/pkeegan/

    Espero que te sirva.

    Saludos desde Loja, Ecuador

  21. Wilfredo dijo:

    Saludo jorge,

    Jorge que tan estable esta la arquitectura ejb 3.0 como para comenzar a desarrollar un sistema grande con ella, o utilizar el API JDBC. es un sistema que podria ser accesado por un numero de 100 a 400 usuario simultaneamente.

    Jorge y por ultimo que posibilidades habria de pode contactarte telefonicamente. este es mi correo lopez_wilfredo@hotmail.com

  22. Fabrizio dijo:

    Tengo una pregunta inicio a programar con Netbeans 6.0 al momento de efectuar una busqueda por apellidos lo hace pero unicamente busca el primero de la base de datos lo que yo necesito que alguien me oriente o me diga que al momento de darle busqueda me listo todos los que encuentre con ese apellido no ce como hacerlo..

    atte

    fabrizio

  23. Hola Fabrizio,

    ¿Estás utilizando persistencia? Si es así mira el link que ubiqué en la actualización de éste post. Si no es tú caso me imagino que usas SQL, entonces revisa tus sentencias para ver haces mal.

    Si gustas me puedes dar más detalles de tú código para poder ayudarte de una mejor manera.

    Saludos, desde Loja al sur del Ecuador

  24. arturo dijo:

    hola jorge ….. como va eso amigo…

    Te cuento lo que me pasa:
    Esto realizando una aplicacion web en java con JSF(para trabajar de modo visual con el formulario),
    y ya tengo el formulario hecho , ahora mi problema es que cuando le asigno el id a cada campo de texto, luego en el JavaBean es como que no me reconoce la variable… Por ejemplo : tengo un boton enviar , en donde le hice doble click para introducir el codigo y obtener los datos de los campos de texto para almacenarlos en la db, y me da error sobre los nombres de los campos… ¿ Porque no me estan reconociendo las variables de los campos de texto del formulario ?

  25. oscar sanchez dijo:

    exelente pagina señor jorge me ha yudado bastante en mi proyecto pero quisiaera saber si me podria ayudar para conseguir jalar los datos de una tabla en mysql y poder desplegarlos y escogerlos y llenar la base de datos como por ejemplo un form donde se necesita escoger la ciudad gracias agradeceria su ayuda ok.

  26. cielito dijo:

    ayudaaaaaaaaa tengo hasta el jueves 19 antes de las 3pm porfava..

    Construir una aplicación que permita automatizar el sistema de información académico de la Universidad Privadapara los alumnos de la carrera de Ingeniería de sistemas, de acuerdo a los siguientes criterios que se plantean a continuación:

    CARACTERISTICAS DE LA APLICACIÓN:
    • DEBE SER ORIENTADA A OBJETOS
    • DEBE SER EN ENTORNO VISUAL(Java Swing)
    • DEBE ESTAR BASADA EN ESTRUCTURA DE DATOS (ARREGLOS O LISTAS (vectores, HashTable, etc.)). NO USAR BASE DE DATOS

    ALCANCES DE LA APLICACIÓN:
    El sistema debe estar conformado por 4 formularios los cuales será invocado desde un JMenuBar.
    FORMULARIO 1: REGISTRO DE ALUMNOS
    Se almacenarán los siguientes datos: CodAlu (Código del alumno), ApeAlu (Apellido del Alumno) y NomAlu (Nombre del Alumno)

    En este formulario se podrán realizar las operaciones de mantenimiento de datos de los alumnos (tales como: Insertar, Modificar, Eliminar y buscar). Todos los alumnos Ingresados deben Mostrarse en forma de Listado

    FORMULARIO 2: REGISTRO DE ASIGNATURAS
    Se almacenarán los siguientes datos: CodAsi (Código de la asignatura), NomAsi (Nombre de la asignatura) y ciclo.

    En este formulario se podrán realizar las operaciones de mantenimiento de datos de los alumnos (tales como: Insertar, Modificar, Eliminar y buscar). Todos los alumnos Ingresados deben Mostrarse en forma de Listado
    FORMULARIO 3: REGISTRO DE NOTAS
    Se almacenarán los siguientes datos: CodAlu (Código del alumno), CodAsi (Código de la asignatura), PC1, EP, PC2, TP, EF, SUST, PF.

    El ingreso de notas en este formulario debe realizarse de la siguiente forma:

    a) Se debe seleccionar mediante un jCombo al alumno.
    b) Luego, seleccionar mediante otro combo el ciclo en el cual el alumno está matriculado
    c) Luego seleccione la asignatura que corresponde al ciclo donde el alumno está matriculado. (El combo automáticamente debe presentar dichas asignaturas)
    d) Luego Ingresar la notas que correspondan. Al finalizar se debe presionar el botón Grabar. (El cálculo del Promedio final debe ser automático)
    e) Los Datos ingresados debe visualizarse en forma de listado

    FORMULARIO 4: REPORTE DE NOTAS
    Este formulario debe visualizarse el reporte de notas de acuerdo a los siguientes criterios: Por asignaturas, Por ciclo, Por Alumnos y por situación académica (aprobado o desaprobado)

    Consideraciones Finales:
    Los listados de datos deben presentarse en u TextArea u otro Control aparente, tal como un jTable. El diseño de los formularios debe tener estética, orden y debe ser de fácil uso para el usuario.

  27. Felipe dijo:

    hola Jorge, gracias por compartir su trabajo. hermano queria preguntarle si me podrias facilitar el codigo de esta aplicacion. de antemano muchas gracias!

  28. Danay dijo:

    Hola estoy desarrollando una app en java usando netbeans, y tengo un combobox al que le adiciono objetos de tipo Item(Clase creada por mi que contiene el id y la descripcion del item), pero tengo un problema necesito bindear este combobox con una clase javabeans y no se como hacerlo, pues al bindear el combobox con la propiedad correspondiente da error ya que el combo lo que tiene son items, y lo que tiene la propiedad es un string. Pueden ayudarme????, gracias de antemano.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s