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".
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 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); } });
Il doit probablement s'agir d'une solution triviale, ...mais comment faire pour rafraichir ce shell?
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);
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.
Partager