IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaFX Discussion :

Comment détecter le temps de survol d'un noeud graphique avant de déclencher une action


Sujet :

JavaFX

  1. #1
    Membre du Club
    Homme Profil pro
    Ingénieur projet
    Inscrit en
    Juin 2014
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur projet
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2014
    Messages : 46
    Points : 43
    Points
    43
    Par défaut Comment détecter le temps de survol d'un noeud graphique avant de déclencher une action
    Bonjour,

    Je souhaite afficher une zone de texte à l'écran lorsque la souris survol un noeud graphique.
    J'ai donc utilisé des MouseEvent pour cela (setOnMouseEntered, setOnMouseMoved, setOnMouseExited), cela fonctionne correctement.
    Je souhaite maintenant que cette zone de texte n'apparaisse que lorsque l'utilisateur laisse son curseur au moins 2 secondes au dessus du noeud graphique.

    C'est là que je bloque.

    Je m'y prends peut être mal, mais j'ai testé des choses avec notamment des timers, ... , malheureusement sans succès.
    Vos idées sont les bienvenues...


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
                  // La classe RecatorIcon permet d'importer un noeud graphique dans le contenu de la fenêtre.
                            ReactorIcon icn = new ReactorIcon();
     
    			left_pane.getChildren().add(icn);
     
                            // Création d'une zone de texte affichant des informations lorsque le noeud graphique est sélectionné		
    			icn.setOnMouseEntered(new EventHandler<MouseEvent>(){
    				public void handle(MouseEvent mouseEvent){
    					reactorTypeLabel.setVisible(true);
    					reactorTypeLabel.setText(icn.getreactorType()+"\n"+icn.getreactorDescription());
    					getChildren().add(reactorTypeLabel);
    				}
    			});
     
    			// Permet de déplacer la zone de texte lorsque l'utilisateur déplace la souris
    			icn.setOnMouseMoved(new EventHandler<MouseEvent>(){
    				public void handle(MouseEvent mouseEvent){
    					setCursor(Cursor.HAND);
     
    					reactorTypeLabel.setTranslateX(mouseEvent.getSceneX()+15);
    					reactorTypeLabel.setTranslateY(mouseEvent.getSceneY()+15);
    				}
    			});
     
                            // suppression de la zone de texte lorsque la souris quitte le noeud graphique
    			icn.setOnMouseExited(new EventHandler<MouseEvent>(){
    				public void handle(MouseEvent mouseEvent){
    					setCursor(Cursor.DEFAULT);
    					reactorTypeLabel.setVisible(false);
    					getChildren().remove(reactorTypeLabel); 
    				}
    			});

  2. #2
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Alors pour faire ce genre de chose, j'ai du utiliser ReactFX et me baser sur le contenu de ce blog post de Tomas Mikula.

    Au début, j'avais essaye de construire une PauseTransition qui est initialisée lorsqu'on choppe mouseEntered, qui est relancée a chaque fois que mouseMoved est détectée, annulée lors d'un mouseExited et qui si elle n'est pas interrompue lance son action au bout d'un certain temps. L'ennui c'est que parfois des évènements sont sautés sous certaines conditions et donc que ça ne marchait pas toujours comme il faut.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  3. #3
    Membre du Club
    Homme Profil pro
    Ingénieur projet
    Inscrit en
    Juin 2014
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur projet
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2014
    Messages : 46
    Points : 43
    Points
    43
    Par défaut
    Bonjour,
    Merci pour ces infos.
    J'ai essayé d'utiliser ReactFX et de me baser sur le contenu du blog post de Tomas Mikula. J'ai créé deux nouvelles classes MouseStationnaryHelper et MouseStationnaryEvent dans mon projet à partir du contenu du blog.
    Puis dans ma classe principale, j'ai intégré les lignes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    private void initialize() {
    ....
         ReactorIcon icn = new ReactorIcon();
     
         left_pane.getChildren().add(icn);		
     
         // detect stationary events on a node after 1 second delay
         MouseStationaryHelper helper =
            new MouseStationaryHelper(icn, Duration.ofSeconds(1));
     
         helper.events().subscribe(either -> either.exec(
    	pos -> showTooltipAt(icn, pos),
    	stop -> hideTooltip()
         ));
    ...
    }
     
    // Display node informations in a Label
    private void showTooltipAt(ReactorIcon icn, Point2D pt){
    	reactorTypeLabel.setText(icn.getreactorType()+"\n"+icn.getreactorDescription());
    	reactorTypeLabel.setVisible(true);
    	getChildren().add(reactorTypeLabel);
    	System.out.println(reactorTypeLabel.getText());
    }
     
    // Close the informations label	
    private void hideTooltip(){
    	getChildren().remove(reactorTypeLabel);
    }
    En ce qui concerne l'affichage, cela fonctionne correctement, la zone de texte s'ouvre bien après un délai d'1s mais disparaît instantanément...
    J'ai du mal à cerner le problème.

  4. #4
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Le problème vient peut-être du fait que tu utilises un Tooltip au lieu d'un truc géré par toi-même genre un nœud flottant au-dessus de la scène (prévoir un Pane servant de calque pour les y afficher), une Window ou un Dialog, non ?

    Difficile à dire sans exemple permettant de tester et reproduire le problème.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

Discussions similaires

  1. Comment déclencher une action onbeforeunload
    Par Romalafrite dans le forum Général JavaScript
    Réponses: 0
    Dernier message: 03/10/2013, 17h43
  2. Réponses: 8
    Dernier message: 07/10/2011, 18h09
  3. Réponses: 3
    Dernier message: 17/08/2011, 12h12
  4. Réponses: 5
    Dernier message: 22/11/2010, 17h39
  5. Comment détecter le type d'un fichier survolant un JPanel
    Par greg0ire dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 26/07/2007, 08h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo