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 :

Clignoter un composant SWT


Sujet :

SWT/JFace Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 58
    Par défaut Clignoter un composant SWT
    Selon ce post : http://www.developpez.net/forums/sho...d.php?t=486065 on ne peut avec un timer modifié l'interface il faut utiliser syncExec et syncExec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    display.syncExec(
      new Runnable() {
        public void run(){
          label.setText(text);
        }
      });
    mais j'ai du mal à voir comment je peux l'utiliser, peut-on me conseiller svp ?

    dommage que ceci marche pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
                     ActionListener taskPerformer = new ActionListener() {
    			public void actionPerformed(ActionEvent arg0) {				
    				 //GestionMultimedia.this.clignotePrix();
    				if ( GestionMultimedia.this.labelPrix.getVisible() )
    					GestionMultimedia.this.labelPrix.setVisible(false);
    				else
    					GestionMultimedia.this.labelPrix.setVisible(true);
    			}
    		  };		 
     
     
    		TimerPrix = new Timer(500, taskPerformer);
    		TimerPrix.start();

  2. #2
    Membre Expert
    Avatar de azerr
    Homme Profil pro
    Ingénieur Etude JEE/Eclipse RCP
    Inscrit en
    Avril 2006
    Messages
    942
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Etude JEE/Eclipse RCP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2006
    Messages : 942
    Par défaut
    Bonsoir,

    Tout d'abord ce qu'il faut comprendre c'est qu'une SWT seule la thread (Display) qui construit l'IHM peut modifier une widget SWT. (appeler le setText , appeler le setVisible...)

    Donc dans ton code, c'est uen Thread (Timer Swing) qui tente de modifier l'etat de ta widget.

    Le lien que tu as trouve te donne la solution. Il faut pas appeler directemnt le code SWT dans la thread mais l'englober dans un display.syncExec.

    Je viens de me faire une ptite classe de test qui gere ce que tu souhaites. Voici la classe :

    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
     
    import javax.swing.Timer;
     
    import org.eclipse.swt.SWT;
    import org.eclipse.swt.layout.FillLayout;
    import org.eclipse.swt.widgets.Display;
    import org.eclipse.swt.widgets.Label;
    import org.eclipse.swt.widgets.Shell;
     
    public class Clignotement {
     
    	public static void main(String[] args) {
    		final Display display = new Display();
     
    		Shell shell = new Shell(display, SWT.SHELL_TRIM);
    		FillLayout layout = new FillLayout();
    		shell.setLayout(layout);
     
    		final Label labelPrix = new Label(shell, SWT.NONE);
    		labelPrix.setText("Label 0");
     
    		ActionListener taskPerformer = new ActionListener() {
    			public void actionPerformed(ActionEvent arg0) {
    				if (display.isDisposed())
    					return;
    				display.syncExec(new Runnable() {
    					public void run() {
    						if (labelPrix.getVisible())
    							labelPrix.setVisible(false);
    						else
    							labelPrix.setVisible(true);
    					}
    				});
    			}
    		};
     
    		Timer TimerPrix = new Timer(1000, taskPerformer);
    		TimerPrix.start();
     
    		shell.pack();
    		shell.open();
     
    		while (!shell.isDisposed()) {
    			if (!display.readAndDispatch())
    				display.sleep();
    		}
     
    		display.dispose();
    	}
    }

    Au passage il faut bien penser a tester display.isDisposed() avant d'appler le
    syncExec.

    Angelo

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 58
    Par défaut
    Merci beaucoup ça fonctionne parfaitement. Faut juste penser à passer le bon display sinon ça fonctionne pas !


    PS : Désolé pour ma réponse tardive.

  4. #4
    Membre Expert
    Avatar de azerr
    Homme Profil pro
    Ingénieur Etude JEE/Eclipse RCP
    Inscrit en
    Avril 2006
    Messages
    942
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Etude JEE/Eclipse RCP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2006
    Messages : 942
    Par défaut
    Pour etre sur de recuperer le bon display tu peux faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Display display = labelPrix.getDisplay();
    ce qui donne :

    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
    		ActionListener taskPerformer = new ActionListener() {
    			public void actionPerformed(ActionEvent arg0) {
                                    Display display = labelPrix.getDisplay();
    				if (display.isDisposed())
    					return;
    				display.syncExec(new Runnable() {
    					public void run() {
    						if (labelPrix.getVisible())
    							labelPrix.setVisible(false);
    						else
    							labelPrix.setVisible(true);
    					}
    				});
    			}
    		};
    Angelo

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

Discussions similaires

  1. Problème affichage avec composant SWT
    Par alouky88 dans le forum SWT/JFace
    Réponses: 1
    Dernier message: 05/06/2012, 11h42
  2. Cherche composant SWT
    Par Bdloul dans le forum SWT/JFace
    Réponses: 2
    Dernier message: 07/11/2011, 17h00
  3. Réponses: 1
    Dernier message: 11/01/2010, 11h32
  4. [SWT] Redraw de composant SWT depuis un thread non SWT
    Par Slayne dans le forum SWT/JFace
    Réponses: 3
    Dernier message: 07/02/2008, 09h44
  5. Réponses: 2
    Dernier message: 14/03/2007, 14h27

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