java.lang.IllegalStateException: Attempt to mutate in notification (JDateChooser, JAVA) – java date datepicker

Pregunta:


Buenos dias!

Estoy creando una replica de un programa escrito en VB.NET en JAVA a modo de practica. Estoy teniendo un problema molesto y que no he podido exactamente identificar el porque es causado… veran, estoy usando unas librerias descargadas de la siguiente fuente:

http://toedter.com/jcalendar/

En VB.NET hay un componente que se llama DateTimePicker que en JAVA no existe, y es el porque tuve que descargar librerias desde internet para poder obtenerlo. Estoy usando el componente JDateChooser que es muy similar al de VB.NET… la unica diferencia es que al elegir una fecha del mismo, el componente imprime dicha fecha en el textfield con formato de fecha corta (10/24/2016) mientras que en el otro programa original, lo imprimia en fecha larga (Lunes, 24 de octubre de 2016).

introducir la descripción de la imagen aquí

Para solucionar este inconveniente, escribi una pequeña funcion en mi clase para que digamos, “convierta” o “traduzca” (como quieras llamarlo) ese formato de fecha corta a fecha larga:

public String getFechaLarga(String fecha) throws ParseException{
    Calendar c = Calendar.getInstance();
    Date date = new SimpleDateFormat("MM/dd/yyyy").parse(fecha);
    c.setTime(date);
    String hoy=null;
    switch(c.get(Calendar.DAY_OF_WEEK)){
        case 1: hoy="Domingo,";break;
        case 2: hoy="Lunes, ";break;
        case 3: hoy="Martes, ";break;
        case 4: hoy="Miércoles, ";break;
        case 5: hoy="Jueves, ";break;
        case 6: hoy="Viernes, ";break;
        case 7: hoy="Sábado, ";break;
    }
    hoy = hoy + c.get(Calendar.DAY_OF_MONTH);
    switch(c.get(Calendar.MONTH)){
        case 0: hoy=hoy + " de enero";break;
        case 1: hoy=hoy + " de febrero";break;
        case 2: hoy=hoy + " de marzo";break;
        case 3: hoy=hoy + " de abril";break;
        case 4: hoy=hoy + " de mayo";break;
        case 5: hoy=hoy + " de junio";break;
        case 6: hoy=hoy + " de julio";break;
        case 7: hoy=hoy + " de agosto";break;
        case 8: hoy=hoy + " de septiembre";break;
        case 9: hoy=hoy + " de octubre";break;
        case 10: hoy=hoy + " de noviembre";break;
        case 11: hoy=hoy + " de diciembre";break;
    }
    hoy = hoy + " de " + c.get(Calendar.YEAR);
    return hoy;
}

La funcion funciona correctamente (bueno, “casi” creo) como se puede apreciar:

introducir la descripción de la imagen aquí

Ahora vienen los problemas… y porque coloco la funcion tambien?, pues no se exactamente si es esto lo que me esta dando la excepción o no. Al inicio, me daba el error “Unparseable Date”, y era porque el programa intentaba convertir a Date la cadena ya convertida del TextField de la fecha (como si tomara la fecha corta, lo convierte a fecha larga y volviese a tomar la fecha larga para convertir… pero claro, daria error porque ya estaba convertida). Lo que hice fue ponerle una condicion para regularlo (si la cadena del TextField es menor o igual a 10 caracteres, entonces procede).

((JTextFieldDateEditor)calendario.getDateEditor()).addPropertyChangeListener(
    new PropertyChangeListener() {
        @Override
        public void propertyChange(PropertyChangeEvent pce) {
            try {
                if(((JTextFieldDateEditor)calendario.getDateEditor()).getText().length() <= 10){                  
                    ((JTextFieldDateEditor)calendario.getDateEditor()).setText(admin.getFechaLarga(((JTextFieldDateEditor)calendario.getDateEditor()).getText()));
                }                                       
            } catch (ParseException ex) {
                Logger.getLogger(NuevaEntrada.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    });

Parecia funcionar todo correctamente, pero al momento yo de cambiar hacia otra fecha, me lanzo otro error mas… y esta vez se quejaba de que el JTextField de la fecha estaba “vacio”. Le inserte otra condicion mas al if… (Si la cantidad de caracteres de la cadena del TextField no es igual a 0, entonces procede) Asi quedo el evento propertyChange a la final:

((JTextFieldDateEditor)calendario.getDateEditor()).addPropertyChangeListener(
    new PropertyChangeListener() {
        @Override
        public void propertyChange(PropertyChangeEvent pce) {
            try {
                if(((JTextFieldDateEditor)calendario.getDateEditor()).getText().length() <= 10 && 
                     ((JTextFieldDateEditor)calendario.getDateEditor()).getText().length() != 0){                  
                    ((JTextFieldDateEditor)calendario.getDateEditor()).setText(admin.getFechaLarga(((JTextFieldDateEditor)calendario.getDateEditor()).getText()));
                }                                       
            } catch (ParseException ex) {
                Logger.getLogger(NuevaEntrada.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    });

Ahora si, se supone que ya no deberia lanzar mas excepciones creo, pero lanza una ultima excepción… que es la siguiente:

introducir la descripción de la imagen aquí

La linea de codigo donde marca el error, es lo que esta dentro del if (cuando hago uso de dicha funcion que escribi, por eso estoy pensando que el error puede estar ahi):

 ((JTextFieldDateEditor)calendario.getDateEditor()).setText(admin.getFechaLarga(((JTextFieldDateEditor)calendario.getDateEditor()).getText()));

Tambien puede ser que yo no este usando el evento correcto para utilizar mi funcion… quiza existan alternativas del PropertyChangeListener que desconosca. Vi por ahi tambien en el stackoverflow en ingles que este bug desaparece usando SwingUtilities.invokeLater() pero lo mas gracioso de todo, es que ya lo estoy utilizando, y no desaparece ese error…

public static void main(String[]args){
    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            try {
                NuevaEntrada nv = new NuevaEntrada("M001");
            } catch (ClassNotFoundException | SQLException | IOException | ParseException ex) {
                Logger.getLogger(NuevaEntrada.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    });       
}

Agradeceria muchisimo su ayuda…

Preguntado por: TwoDent

SJuan76

El JTextFieldDateEditor acaba usando un SimpleDateFormat1 para formatear la fecha, y al SimpleDateFormat se le puede parametrizar pasándole el String de formato que especifica el API.

Por ejemplo, “Lunes, 24 de noviembre” sería algo así como “EEEE, dd ‘de’ MMMM”.

Simplemente especifica el formato para el SimpleDateFormat, asegúrate que el Locale sea España u otro pais castellanoparlante, y olvídate de listeners y demás.

1 Que suele ser, con mucho, la forma más racional de convertir texto a fechas y viceversa en Java.

Fuente

Related Posts:

Tomcat no encuentra los recursos – java angularjs http
Pregunta: Bueno tengo una aplicación con AngularJS que hace peticiones al API de gitHub como un ejemplo para aprender a usar AngularJS, pero el problema ...
Crear cuenta regresiva N segundos mientras se visualiza una Activity en Android – java android
Pregunta: Quiero implementar una cuenta regresiva de N segundos, que se inicie cuando la Activity se muestre, se pare el contador cuando el usuario decide ...
¿Es legal leer imágenes y descripciones de otro sitio web y ponerlas en mi app? – java woocommerce
Pregunta: ¿Es legal leer imágenes y descripciones de otro sitio web y ponerlas en mi programa? Supongamos que quiero hacer una aplicación como la de ebay, ...
Problema con consulta JPQL + JPA + JSF + EJB – java jsf jpa
Pregunta: @Override public Usuario iniciarSesion(Usuario us){ Usuario usuario = null; String consulta; try { ...
No encuentra el audio dentro de src – java
Pregunta: Tengo una carpeta "audios" dentro de "src", para cuando construya el proyecto pueda reproducir los audios. Intento abrir el audio pero me salta "java.lang.NullPointerException" ...
¿Como saber con Apache POI y java si una columna en excel esta oculta? – java apache-poi
Pregunta: Hola estoy importando archivos excel con extensión xls y xlsx pero mi duda es como poder detectar si la columna de una celda esta ...
Spinner y EditText – java android
Pregunta: Tengo este código para cargar un spinner con datos de una base de datos: private class Getfrutas extends AsyncTask<Void, Void, Void> { ...
¿Cómo enviar datos de una pagina JSP a un Servlet sin un form? – java jsp java-ee
Pregunta: Tengo un problema. No logro recibir un valor por GET en el Servlet, no se por qué. Aquí el código JSP: <html> ...
Ayuda con un Calendario en Linea de Codigo – java
Pregunta: Pues se supone que mi código debería imprimir en algunos meses 31 días según una de mis condiciones pero no lo hace de hecho ...
¿ Por qué se me detiene la aplicación al usar este pequeño código? – java android bottombar
Pregunta: Tengo un bottomBar donde tengo 5 opciones, la última es la del mapa de google API. Mi problema es que al hacer click en ...
Exception java.lang.NumberFormatException al intentar un “.size” dentro de una EL – java jsp jboss
Pregunta: Estoy teniendo una Exception en el siguiente código dentro de un jsp: <c:if test="${usuarios.size gt 10}"> usuarios es un ArrayList que objetos. usuarios no esta vacío ya ...
¿ Cómo implemento este código para android 6.0? – java android
Pregunta: Tengo en un Fragment implementado el Google API y FUNCIONA. Pero funciona en mis 3 móviles que son jellybean, kitkat y lollipop. El ...
Algoritmo de Bresenham, duda con la codificación de los 8 octantes – java matemáticas
Pregunta: En la imagen de arriba muestra todos los cuadrantes de la pantalla: Este algoritmo sirve para el movimiento natural de la pelota, usado en juegos ...
¿Cómo guardar un ImageView en Android? – java android
Pregunta: Mi aplicación está compuesta por un botón y un ImageView y cuando se aprieta el botón la ImageView recibe una imagen que tengo en ...
¿Existe alguna manera de implementar un listener para todos los clicks que se den en una sesión Java? – java
Pregunta: Como la pregunta lo dice, ¿se podrá crear un listener que detecte cada click que se dé en la sesión abierta de Java?. Mi ...

Add a Comment

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *