JFormattedTextField y el método selectAll()


Una pregunta que nos hicieron en otro post era: ¿qué se debe hacer para que cuando un JFormattedTextField gane el foco se sobreescriba el texto que se muestra actualmente?

Mi primer respuesta fue programar el evento focusGained (cuándo gana el foco) e invoca al método selectAll() que permite seleccionar el texto que muestra el JFormattedTextField. En teoría funciona, pero resulta que no es así. La explicación es la siguiente:

Existe un bug, el 4740914, que ha sido reportado desde la versión 1.4 y que en breves palabras nos dice que existe un problema cuando se llama al método selectAll() de un JFormattedTextField.

La solución se muestra en el mismo reporte del bug. Y es la siguiente:

private void jFormattedTextField1FocusGained(java.awt.event.FocusEvent evt) {
   SwingUtilities.invokeLater(new Runnable() {
      public void run() {
         jFormattedTextField1.selectAll();
      }
   });
}

Básicamente lo que se hace es crear un hilo que llama al método selectAll sobre el JFormattedTextField. En mi caso lo programé en el método que maneja el evento focusGained. Existe una nota que dice: Please note that this solution does not work when this component is used as an editor in a JTable with surrender-focus enabled.

Espero que les ayude, en especial a quién hizo la pregunta.

10 comentarios en “JFormattedTextField y el método selectAll()

  1. Pequeño detalle, el método SwingUtilities.invokeLater no crea un hilo, sino que ejecuta el runnable en el hilo de swing. Lo que hace ese código si se invoca en el evento es ejecutar el método selectAll() posteriormente al evento de ganar el foco y no en el mismo momento en que se gana el foco.

    1. Hola ignorante,

      Pues revisé mi redacción y en ningún momento digo que SwingUtilities.invokeLater cree un hilo, sino que se crea un hilo con las sentencias new Runnable(){ … y dentro del método run de aquel hilo se llama al método selectAll();. No sé si me explico.

      Gracias por la información de todas maneras.

      Saludos desde Loja – Ecuador

  2. new Runnable() no crea un hilo nuevo. La único forma de crear un hilo nuevo es invocando el método start() de un objeto de la clase Thread.
    SwingUtilities.invokeLater pasa el runnable que es un objeto común y corriente para que se ejecute en el thread de swing.

  3. hola a todos bueno mi duda es un poco de como poder programar un jcombobox del jdeveloper 10g pues he entrado en un conflicto de como se hace para item o para index pues me tiene con una gran temible duda

  4. amigos, como estan, espero que bien, tengo una duda con este JForamttedtextField y lo que pasa es que quiero que a medida que escribo un valor entero este se vaya autoformateando sin necesidad de cambiar el foco, me imagino que debe existir un metodo para ello, agradeco su atencion 🙂

Deja un comentario