Pregunta

Estoy trabajando en un proyecto que utiliza una tabla JT para mostrar, entre otras cosas, una columna de fechas. Necesitábamos la validación de la entrada del usuario para las fechas, así que he implementado una combinación de enmascaramiento para la validación del formato y el análisis para la validación de la fecha real. Lo he hecho usando un editor de celda personalizado para la columna de fecha.

Dentro de mi MaskedCellEditor, tengo un JFormattedTextField. Configuré la máscara para las fechas. Luego agrego un InputVerifier para permitir la validación real. My InputVerifier implementa Verify () para verificar: 1. textField.isEditValid () 2. DateValidator.ValidDate (). Si alguno de ellos no es válido, verificar devuelve falso y el Verificador de entrada bloquea el enfoque en el campo de texto (el editor de celdas) y se muestra un pequeño mensaje de diálogo recordándole al usuario el formato de la fecha.

El mensaje de error es un JDialog pequeño, no decorado, no modal, no enfocable que aparece debajo de la celda que se está editando. Desaparece con una pulsación de tecla o una verificación de fecha exitosa. Está funcionando muy bien, excepto en el caso de un borde pequeño.

Si el usuario selecciona un botón de menú en la parte superior de la aplicación mientras una edición no válida ha abierto el cuadro de diálogo, cambia las pantallas, destruyendo todo lo que está actualmente en la pantalla (incluida la tabla). Sin embargo, dado que se muestra el cuadro de diálogo y no se ha producido una pulsación de tecla / edición exitosa, el cuadro de diálogo nunca se oculta. Permanece visible en un contexto completamente no relacionado en una pantalla diferente. Una vez que el usuario ha apagado la pantalla con la tabla, no hay forma de que se deshaga del cuadro de diálogo.

He debatido lanzar un Timer y / o un MouseListener en el diálogo mismo que haría que desaparezca, pero siento que estoy ignorando el problema real. El diálogo nunca se desecha y estoy bastante seguro de que se debe a que todavía está configurado para ser visible e impide que el recolector de basura se deshaga de él.

Tengo un método de Limpieza en el panel que contiene la JTable, pero no puedo encontrar una buena manera de hacer referencia al cuadro de diálogo (un componente del InputVerifier) ??para deshacerme de él. El diálogo está bastante alejado del panel principal de la tabla. (Panel - > JTable - > CellEditor - > JFormattedTextField - > InputVerifier - > JDialog)

¿Alguna idea sobre cómo forzar el diálogo para que se oculte cuando se destruye la tabla? Si necesitas más detalles, avísame. Estoy tratando de no hacer que ustedes se queden atascados en los detalles, pero hay mucho que hacer.

¿Fue útil?

Solución

Como primer pensamiento, ¿no puedes ir por el enfoque del oyente? Si tiene un método de tipo closeErrorDialog () al que se llama cuando se realiza una validación satisfactoria, también puede llamarlo cuando se selecciona una acción de menú.

Como alternativa, quizás puedas controlar la transición de menú a menú de alguna manera y crear una " limpieza " Método que cerrará cualquier diálogo de error existente. Esto permitiría que cualquier otra acción que deba realizarse al cambiar los menús, ocurra en el mismo lugar.

Solo un par de ideas rápidas de la parte superior de mi cabeza. Espero que estén en la línea de lo que quisiste decir

Otros consejos

Muchas personas me rechazarán por decir esto, pero parece que su diálogo debería ser modal para que los usuarios no puedan cambiarlo sin descartarlo primero. O al menos deshabilite los menús que permiten a las personas cambiar mientras se muestra este cuadro de diálogo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top