Foro sobre Java SE > problema con jOptionPane y requestFocus()
No te compliques la vida con el focus.
Mira a ver si ésto te "ilumina" ;)
http://docs.oracle.com/javase/6/docs/api/javax/swing/InputVerifier.html
http://www.java2s.com/Code/Java/Swing-JFC/InputVerificationDemo.htm
http://www.javalobby.org/java/forums/t20551.html
choces, muchas gracias por responder y tan rapido
si me parece muy buena opcion, de hecho me parece bien lo que comentan en
http://www.javalobby.org/java/forums/t20551.html
como opciones para denotar el error al cliente, colorear el cuadro, lo del mensaje tipo tooltip incluso yo contemplaba en mi aplicacion un jpanel de estado donde mostrara que campos estaban incorrectos en forma de lista y usando esta opcion del input verifier con su metodo shouldYeldFocus() queda perfecto...pero sigo con la espinita de querer hacerlo con un jOptionPanel.showMessageDialog()..
si quisiera hacerlo que salga una ventanita de dialogo JDialog o jOptionPane, como se podria hacer?
por cuestiones de tiempo terminare usando el inputverifier pero por cuestiones de curiosidad quisera resolverlo por la forma que les planteo en el post.
reitero mi agradecimiento por tu tiempo y amabilidad.
NUEVAS NOTICIAS!!!!
leyendo por ahi sobre EDT, SwingUtilities.invokeLater(Runnable) encontre la forma de arreglar lo del focus. segun los eventos del foco "no se ejecutan" en el EDT si mal no entendi, el edt es el event dispatch threat, es decir el hijo de ejecucion donde se ejecuta todo lo relacionado con los componentes awt y swing. segun las lecturar a excepción de lo del foco. entonces tenemos diferentes hilos corriendo "simultanea o paralelamente" (ojo con las "", es realidad es no al mismo mismo tiempo, es otro tema eso.) por lo que a la hora de que el jFTF pide el foco con el metodo requestFocus el evento se ejecuta en otro hilo. (no tengo el conocimiento necesario ni comprobado, segun lei por ahi si mal no entendi). para no dar mas largas aqui esta como lo solucione y funciona bien
---------------------------------------------------------
private void jftfFocusLost(java.awt.event.FocusEvent evt) {
//JOptionPane.showMessageDialog(this, "formato invalido", "campo invalido", JOptionPane.ERROR_MESSAGE);
try {
jftf.commitEdit();
} catch (ParseException ex) {
Logger.getLogger(RegistroClientes.class.getName()).log(Level.SEVERE, null, ex);
JOptionPane.showMessageDialog(this, "formato invalido", "campo invalido", JOptionPane.ERROR_MESSAGE);
/////////////////////AQUI EMPIEZA LA SOLUCION
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
jftf.requestFocus();
}
});
//////////////////////////AQUI TEMINA LA SOLUCION
}
la peticion del foco la envolví en otro hilo mediante el SwingUtilities.invokeLater( Runnable) y listo.
NOTA: espero alguien me pueda aclarar mas este asunto y explicar porque funciona asi esto.
Suele ser un error muy frecuente el no crear los componentes de Swing dentro del EDT.
Creo que esa es la causa principal de tu problema, y el por qué te funciona tal y como lo has hecho.
Apostaría "algo" a que tu jFormattedTextField no se ha creado en el EDT ;)
estoy usando el netbeans como gui para hacer la aplicacion
el jftf simplemente lo arrastre del panel de objetos. supongo que lo que no se instancio en el EDT fue el jOptionPanel
quisas eso sea. hare pruebas creando el JFTF con el swingUtilies.invokeLater()
y leere mas sobre swing e hilos
muchas gracias por la atencion
encontré informacion interesante al respecto que bien vale una leidita express
http://www.adictosaltrabajo.com/tutoriales/tutoriales.php?pagina=EjemploSwingWorker
y
http://ignorante.wordpress.com/2011/10/19/swing-y-edt/
interesante sin duda lo de la clase SwingWorker.
Siempre que haya dudas sobre si un bloque de código se ejecuta o no en el EDT, se puede usar este método de la clase SwingUtilities:
public static boolean isEventDispatchThread()
Returns true if the current thread is an AWT event dispatching thread.
As of 1.3 this method is just a cover for java.awt.EventQueue.isDispatchThread().
Returns:
true if the current thread is an AWT event dispatching thread
hijole! perfecto, muchas gracias por el tip
Hola que tal, mi nombre es Javier Torres
primera vez posteando y es un grito de auxilio en lugar de un aporte...
estoy desarrolando un gui para una agenda telefonica, estoy en la pantalla de alta de registro.
estoy usando los "nuevos" jFormattedTextField con un formateador para mascaras MaskFormatter("###-##-##")
estoy validando que cuando este incompleto el jFTF mande un
JOptionPane.showMessageDialog(this, "formato invalido", "campo invalido", JOptionPane.ERROR_MESSAGE);
para validar eso, pongo este codigo en un FocusEvent del jFTF asi:
private void jftfFocusLost(java.awt.event.FocusEvent evt)
{
//JOptionPane.showMessageDialog(this, "formato invalido", "campo invalido", JOptionPane.ERROR_MESSAGE);
try {
jftf.commitEdit();
} catch (ParseException ex) {
Logger.getLogger(RegistroClientes.class.getName()).log(Level.SEVERE, null, ex);
JOptionPane.showMessageDialog(this, "formato invalido", "campo invalido", JOptionPane.ERROR_MESSAGE);
}
miFormattedTextField.requestFocus(); ////////////// HE AQUI EL PROBLEMA!!!!!!!!!!!!!!!!!!!!!!
}
lo valida bien, cuando no se completa el formatted field manda el mensaje, el problema es cuando quiero que despues de cerrar el mensaje del jOptionPane ese formatted field que no cumplio con la validacion recupere el foco para que el usuario corrija el texto.
y en cuando ejecuta esta linea de codigo : miFormattedTextField.requestFocus(); ////////////// HE AQUI EL PROBLEMA!!!!!!!!!!!!!!!!!!!!!!
se cicla el joption pane, aparece tres veces seguidas.
aparentemente antes de cerrarse el joption pane, el formatted field gana el foco y como sigue sin corregirse el texto vuelve a mandar el jOption pane y vuelve a pasar lo mismo 3 veces seguidas.
ya probe el metodo requestFocusOnWindow() y pasa lo mismo
probe otras formas de validad el campo para que me adviertiera del error y sucede lo mismo siempre que uso un jOptionPane y quiero regresar el foco a otro componente se cicla 3 veces.
alguien sabe algo de esto???
como lo resolvieron? o algun "workaround" que sepan porfavor!!
javier_tf@live.com