Saltar al contenido

Equivalente de FocusEvent.getOppositeComponent en JavaFx

Después de investigar con expertos en esta materia, programadores de deferentes ramas y profesores hemos dado con la solución al dilema y la compartimos en esta publicación.

Solución:

No hay equivalente en JavaFX. Los cambios de enfoque se manejan como una propiedad booleana para cada ventana por separado, por lo que solo puede saber si una ventana recibió o perdió el foco. Si registra un oyente en todas las ventanas de su aplicación, podría saber si una de ellas perdió el foco cuando otra lo ganó.

No hay “FocusEvent” en JavaFX, puede encontrar todos los tipos de eventos enumerados en Event.

Puede solicitar la función aquí.

Finalmente encontré una forma semi-satisfactoria de manejar el problema, usando el orden de los eventos en JavaFX, así que lo publico como respuesta en caso de que pueda ayudar a otros.

Cuando se cierra una ventana w1, dando foco a una ventana w2, el orden de los eventos es el siguiente:

  1. w1 recibe el evento WINDOW_HIDING
  2. w2 focusProperty cambia a true
  3. w1 recibe el evento WINDOW_HIDDEN

Así que escribí el siguiente código para permitirme saber si el foco proviene de una ventana interna:

public class MainStage 
    private Stage primaryStage;
    private AtomicBoolean triggerEventOnFocusGain = new AtomicBoolean(true);

    ...

    primaryStage.focusedProperty.addListener((prop, oldVal, newVal) -> 
        if(newVal.booleanValue() && triggerEventOnFocusGain.get()) 
            doStuff();
        
    );


public class SomeDialog 
    private MainStage mainStage;
    private Window dialogWindow;

    ...

    dialogWindow.addEventHandler(WindowEvent.WINDOW_HIDING, event ->
        mainStage.setTriggerEventOnFocusGain(false));
    dialogWindow.addEventHandler(WindowEvent.WINDOW_HIDDEN, event ->
        mainStage.setTriggerEventOnFocusGain(true));

El único problema es que tengo que hacer eso para todas las ventanas/diálogos internos.

En mi caso, finalmente decidí que podía salirme con la mía haciendo eso solo por un puñado de diálogos, para los cuales desencadenar el evento sería problemático e ignorar a los demás.

La otra forma, por supuesto, sería introducir un padre abstracto común de todas mis clases de vista que haga el código anterior.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

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