Foros del Web » Programación para mayores de 30 ;) » Java »

¿Cómo controlar la pérdida de foco de un elemento en JavaFX 2.X (.fxml)?

Estas en el tema de ¿Cómo controlar la pérdida de foco de un elemento en JavaFX 2.X (.fxml)? en el foro de Java en Foros del Web. Buenos días, la duda es la siguiente: Estoy haciendo un programa en Java empleando JavaFX 2.X y creando la ventana mediante FXML. Tengo un 'TextField' ...
  #1 (permalink)  
Antiguo 13/06/2012, 06:06
Avatar de UnaVezFuiPez  
Fecha de Ingreso: febrero-2012
Mensajes: 9
Antigüedad: 12 años, 2 meses
Puntos: 1
Pregunta ¿Cómo controlar la pérdida de foco de un elemento en JavaFX 2.X (.fxml)?

Buenos días, la duda es la siguiente:

Estoy haciendo un programa en Java empleando JavaFX 2.X y creando la ventana mediante FXML.

Tengo un 'TextField' en el que el usuario debe introducir un número (double). Al pulsar intro, el controlador de eventos 'onAction' llama a un método que en primer lugar sustituye las ',' por '.' y luego comprueba si la cadena introducida es un (double).

El problema es que si en vez de pulsar intro pulso tab, o con el ratón pincho en otro elemento de la ventana el controlador 'onAction' no se activa y no se comprueba si el texto introducido es un número o no.

He buscado información sobre si existe un controlador de eventos (en FXML) que controle la pérdida de foco de un elemento concreto, pero no he encontrado nada.

Entonces, ¿Cómo puedo hacer para controlar la perdida de foco de un elemento?

He encontrado el controlador 'onKeyPressed' que podría usar para comprobar si se ha pulsado el tabulador, pero me parece una solución un poco chapucera, ya que se comprueba cada pulsación de teclado y, aunque esto no suponga ningún problema en cuanto a pérdida de rendimiento, conceptualmente no es correcto.

Por otro lado, esta solución solo resuelve el problema del tabulador pero no la acción del ratón. Para esto último, ninguno de los controladores de eventos relacionados con el ratón tienen por qué activarse cuando ya se ha introducido el texto, con lo que a mi entender me quedo sin poder controlar este evento.

¿En serio FXML no tiene una forma directa de controlar que un elemento pierda el foco (deje de estar seleccionado)?

Muchas gracias por adelantado.
  #2 (permalink)  
Antiguo 14/06/2012, 02:59
Avatar de UnaVezFuiPez  
Fecha de Ingreso: febrero-2012
Mensajes: 9
Antigüedad: 12 años, 2 meses
Puntos: 1
De acuerdo [Resuelto] ¿Cómo controlar la pérdida de foco de un elemento en JavaFX 2.X (.fxml)?

Bueno, aunque no ha contestado nadie, he estado rebuscando en otros foros y gracias a la ayuda de una amiga he dado con la solución. Como supongo que según se vaya extendiendo el uso de JavaFX a más gente le surgirá esta misma duda, la pongo aquí. De todas formas, si alguien sabe como hacerlo directamente (si es que se puede) en el archivo .fxml que lo ponga. Y si a alguien os sirve de ayuda, pues no cuesta nada dejar un mensajito de agradecimiento :)

Decir que esto hay que incluirlo en el archivo .java correspondiente al archivo .fxml

Lo primero, importar las clases necesarias:
Código:
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
Luego, dentro de la definición de la clase, definir la variable de tipo 'TextField' que hemos definido en el archivo .fxml:

Código:
public class VentanaPrincipal implements Initializable {

   ...

   @FXML
   private TextField dimX;

   ...
Después, dentro del método initialize, creamos un Listener a la propiedad focused, que detectará cuando el elemento pierde el foco:

Código:
   @Override    
   public void initialize(URL url, ResourceBundle rb) {

      ...

      dimX.focusedProperty().addListener(new ChangeListener<Boolean>() {
         @Override
         public void changed(ObservableValue<? extends Boolean> arg0, Boolean arg1, Boolean arg2) {
            //Controlamos cuando dimX pierde el foco
            if(!arg2){

               //Aquí va el código que queremos que se ejecute cuando dimX pierda el foco. 

            }
         }
      });

      ...

Etiquetas: addlistener, changed, changelistener, focusedproperty, fxml, javafx
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:20.