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

SWT/JFace Java Discussion :

[SWT]rafraichissement affichage shell en popup


Sujet :

SWT/JFace Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 97
    Points : 89
    Points
    89
    Par défaut [SWT]rafraichissement affichage shell en popup
    Bonjour,

    L'application que je développe pour l'instant dispose d'un TableViewer, pour lequel je voudrais implémenter une fonctionnalité d'affichage en popup des informations d'une ligne sous le curseur après x millisecondes de mouseover.

    Aucun soucis pour récupérer les infos sous le curseur (cf un post précédent d'ailleurs :-) ), ou pour ouvrir un shell à expiration du timer.

    Mon problème provient du fait que je n'arrive pas à rafraîchir le contenu du shell que j'affiche.

    Simple exemple : imaginons que mon tableViewer contienne 3 lignes : abc, def, ghi et que je veuille afficher cette valeur dans le shell.
    si je met mon curseur sur "abc", après 2sec mon shell popup s'affiche avec "abc"...mais si je déplace maintenant mon curseur sur la ligne "def" après 2sec mon popup se redessine à coté de mon curseur mais affiche toujours "abc".

    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
    33
    34
    35
    36
    37
    38
    39
     
    table.addListener(SWT.MouseMove, new Listener() {
    		final Shell s = new Shell( SWT.CLOSE );	 
     
    		    private Runnable timer = null;
     
     
    		    public void handleEvent(final Event e) {
    		        //Récupération du TableItem à la position du curseur
    		        final TableItem item = table.getItem(new Point(e.x, e.y));		        	             
     
    		        if (item != null) {          /*Si le TableItem existe --> != null
    		                                       On vérifie si il y avait déjà un timer lancé.
    		                                       Si c'est le cas, on le stoppe*/
    		        	stopTimer();
    		                                    /*Et on en crée un nouveau...  */
    		            timer = new Runnable() {
    		                public void run() {
    		                    System.out.println("Ouverture du popup");
    		                    String txt1 = item.getText();
    		                    System.out.println("valeur de txt1 : "+txt1);
    		                    utils.Utils.buildVisitC( s, white, item, txt1);//méthode qui construit le shell
    		                    s.pack();
     
     
    		                }
    		            };
    		               table.getDisplay().timerExec(2000, timer);
    		        } else {
    		        	System.out.println("else");
    		            stopTimer();
    		           }		        
    		    }
     
    		    private void stopTimer() {
    		        if (timer != null)
    		            table.getDisplay().timerExec(-1, timer);
    		    }
    		});
    Voici un morceau de la méthode buildVisitC :
    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    public static void buildVisitC(Shell s, Color white, TableItem item, String txt1) {
    	    String mytxt1 = txt1;
     
                                                      /*Localisation du popup*/
     
    		                                           /*Le composite contenu dans la frame*/
    			Composite composite1 = new Composite(s, SWT.NONE);
    			FormLayout composite1Layout = new FormLayout();
    			composite1.setLayout(composite1Layout);
    			FormData composite1LData = new FormData();
    			composite1LData.width = 392;
    			composite1LData.height = 104;
    			composite1LData.left =  new FormAttachment(0, 1000, 0);
    			composite1LData.top =  new FormAttachment(0, 1000, 0);
    			composite1.setLayoutData(composite1LData);
    			composite1.setBackground(white);
    			composite1.redraw();
    			                                      /*Contenu du composite*/
     
     
    			    Text text6 = new Text(composite1, SWT.None);
    			    System.out.println("---- text6 before: "+text6.getText());
    				text6.setText(mytxt1);
    				System.out.println("---- text6 after: "+text6.getText());
    				FormData text6LData = new FormData();
    				text6LData.width = 61;
    				text6LData.height = 15;
    				text6LData.left =  new FormAttachment(0, 1000, 265);
    				text6LData.top =  new FormAttachment(0, 1000, 58);
    				text6.setLayoutData(text6LData);
    				text6.setForeground(fgColor);
    				text6.setEditable(false);
     
    int abscisse = item.getDisplay().getCursorLocation().x + 14;
            int ordonnee = item.getDisplay().getCursorLocation().y + 10;
            Point location = new Point(abscisse, ordonnee);
            s.setLocation(location);                  
     
            s.setVisible(true);
            s.forceActive();	
           s.setLayout(new FormLayout());	
           s.setSize(400, 138);
    Il doit probablement s'agir d'une solution triviale, ...mais comment faire pour rafraichir ce shell?
    Petite précision : les valeurs au niveau des différents system.out.println sont bein correctes, elles.

    Autre solution pour régler le prob de rafraichissement (mais dont je ne veux pas) : J'aurais aussi pu chaque fois recréer un objet shell quand un popup devait s'afficher, mais ca je ne le souhaite pas car il faudrait gérer les fermetures automatiques des "anciennes" des fenêtres (sinon, un nouveau shell serait chaque fois créé, et il viendraient tous se superposer, or moi je n'en veux qu'un seul qui se redessine).

    Si quelqu'un pouvait m'aider ce serait cool.

    Merci beaucoup.

  2. #2
    Membre confirmé Avatar de desert
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    414
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2007
    Messages : 414
    Points : 479
    Points
    479
    Par défaut
    Bonjour,
    Citation Envoyé par pssst
    Autre solution pour régler le prob de rafraichissement (mais dont je ne veux pas) : J'aurais aussi pu chaque fois recréer un objet shell quand un popup devait s'afficher, mais ca je ne le souhaite pas car il faudrait gérer les fermetures automatiques des "anciennes" des fenêtres (sinon, un nouveau shell serait chaque fois créé, et il viendraient tous se superposer, or moi je n'en veux qu'un seul qui se redessine).
    C'est pourtant ce que je ferais. Avec cette solution, il reste tout de même un choix à faire :
    - soit tu laisses ce shell ouvert pour pouvoir pointer ton curseur dessus (comme le tooltip par défaut d'Eclipse lorsque tu laisses le curseur sur un mot-clé) et un nouveau shell sera recréé + destruction de l'ancien à chaque attente des 3s sur un tableitem.
    - soit tu détruits l'ancien si jamais tu déplaces la souris. Un nouveau sera recréé lors de l'attente.
    Ton autre solution de réactualisation n'est pas non plus mauvaise.
    Il suffirait à chaque attente, de vérifier si un shell existe,
    si oui, tu lui passes ton texte via une méthode,
    si non, tu en crées un et tu lui passes ton texte.
    Par contre, dans ton exemple, la création d'un shell à cet endroit n'est pas judicieux car un nouveau est créé à chaque déplacement de souris. A éviter donc.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 97
    Points : 89
    Points
    89
    Par défaut
    Salut desert,
    merci beaucoup pour ta (..tes) réponses.

    J'avais continué à bosser un peu sur ce problème de shell et je m'étais finalement "résigné" à recréer un nouveau shell à chaque fois (dans run()).
    Pour éviter d'avoir de nouveaux popups qui si crééraient à outrance à chaque déplacement de souris et de me retrouver finalement avec 15 fenêtres ouvertes, j'ai simplement définit le shell comme "application_modal".
    Seul bémol, dans l'état actuel des choses ceci oblige l'utilisateur à manuellement fermer chaque popup pour pouvoir continuer mais a aussi l'inconvénient de bloquer les autres zones de l'application.

    J'avais essayé en primary_modal, mais cela n'empechait pas la création des autres fenêtres comme je le souhaitais.

    Je tiens donc une solution intermédiaire mais je vais maintenant m'appliquer à trouver une solution qui fait un petit peu moins "bricolage".

    Merci pour tes conseils :-)

  4. #4
    Membre confirmé Avatar de desert
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    414
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2007
    Messages : 414
    Points : 479
    Points
    479
    Par défaut
    Sinon si cela peut t'aider, voici un exemple qui montre ce que je voulais expliquer pour la première solution :
    Code java : 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
    33
    34
    35
    36
    table.addListener(SWT.MouseMove, new Listener() {
        private Shell myShell = null;
        private Runnable timer = null;
     
        public void handleEvent(final Event e) {
            final TableItem item = table.getItem(new Point(e.x, e.y));                                 
            if (item != null) {
                final Display display = table.getDisplay();
                   stopTimer();
                timer = new Runnable() {
                    public void run() {
                        if (myShell != null)
                            myShell.dispose();
                        String txt = item.getText();
                        myShell = new Shell(display, SWT.CLOSE);     
                        myShell.setLayoutData(new GridLayout());
                        Label label = new Label(myShell, SWT.NONE);
                        label.setText(txt);
                        label.pack();
                        myShell.pack();
                        Point location = display.getCursorLocation();
                        myShell.setLocation(location.x+10, location.y+10);
                        myShell.open();
                    }
                };
                display.timerExec(2000, timer);
            } else {
                stopTimer();
            }    
        }
     
        private void stopTimer() {
            if (timer != null)
                table.getDisplay().timerExec(-1, timer);
        }
    });

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 97
    Points : 89
    Points
    89
    Par défaut
    Salut desert,

    J'ai finalement fait comme tu l'as proposé. J'avais déjà essayé cett solution mais j'avais fait une groooooosse faute (digne d'un débutant !) qui faisait tout foirer.
    Maintenant tout fonctionne nickel et on ne peut plus simplement, grâce à toi car au sinon je ne serais pas revenu la dessus :-)

    merci

  6. #6
    Membre régulier
    Inscrit en
    Août 2008
    Messages
    142
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 142
    Points : 71
    Points
    71
    Par défaut
    Bonjour pssst et Desert,

    Malgré le fait que le post sois marqué en "resolu", je reviens là dessus en espérant trouver mon bonheur.

    J'aimeras réaliser quelque chose qui se rapproche du problème de début de pssst. En effet, dans mon tableViewer, je voudrais afficher les informations relatives à une ligne; à la seule différence que je voudrais le faire non pas apres une attente sur une ligne, mais suite à un menu contextuel que j'ajouterais à mon tableViewer. Je voudrais également pouvoir copier les informations de ligne ou de la colonne courante.

    Pour l'instant, j'arrive à afficher le menu contextuel, mais j'ai du mal à recupérer les infos de la ligne et surtt à les balancer dans un nouveau shell.

    J'ai créé le post.

    Pourriez vous m'aider à commencer cela?

    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [VBA]Rafraichissement affichage distant
    Par petitours dans le forum Access
    Réponses: 9
    Dernier message: 20/04/2007, 11h14
  2. RCP SWT ouvrir un shell
    Par LoloBebop dans le forum SWT/JFace
    Réponses: 4
    Dernier message: 24/05/2006, 16h50
  3. problème affichage vidéo en popup
    Par emeraudes dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 06/04/2006, 21h05
  4. affichage d'un popup au bout de x secondes
    Par gipn56 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 10/12/2005, 12h44
  5. Réponses: 2
    Dernier message: 03/08/2004, 10h30

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