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 :

Incompréhension read And Dispatch


Sujet :

SWT/JFace Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 66
    Par défaut Incompréhension read And Dispatch
    J'ai codé une petit une petite horloge ou qd on modifie les heures ou minutes l'heure clignote. et au moment ou je retourne dans le mode normal qui affiche l'heure ... je me suis aperçu que display.readAndDispatch était toujours égale à true. Je ne comprend pas du tout pourquoi ??

    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
     
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.Timer;
    import org.eclipse.swt.*;
    import org.eclipse.swt.events.SelectionAdapter;
    import org.eclipse.swt.events.SelectionEvent;
    import org.eclipse.swt.layout.FillLayout;
    import org.eclipse.swt.widgets.*;
     
    public class Fenetre {
    	Text text;
    	Display display;
    	Group group;
    	String s;
    	private Watch watch;
     
    	public Fenetre(Watch watch) {
    		this.watch = watch;
    		display = new Display();
    		Shell shell = new Shell(display);
    		shell.setText("Watch");
    		shell.addListener(SWT.Close, new Listener() {
    			public void handleEvent(Event event) {
    				System.exit(0);
    			}
    		});
     
    		group = new Group(shell, SWT.NONE);
    		group.setText("Show Time");
    		group.setLayout(new FillLayout());
     
    		text = new Text(group, SWT.NONE);
    		text.setEditable(false);
    		text.setBounds(10, 30, 100, 25);
    		text.setText("12:46");
     
    		/* ActionListener taskPerformer =  new ActionListener() {
    			/*public void actionPerformed(ActionEvent arg0) {
    				if (display.isDisposed())
    					return;*/
     
    				final Runnable timer = new Runnable() {
    					public void run() {
    						if (text.getVisible()) {
    							System.out.println("false");
    							text.setVisible(false);
    						} else
    							text.setVisible(true);
    						display.timerExec(500, this);
    					}
    				};
     
     
    				/*
    				 * text.getDisplay().syncExec(new Runnable() { public void run()
    				 * { if (text.getVisible()) { System.out.println("false");
    				 * text.setVisible(false); } else text.setVisible(true); } });
    				 */
    			//}
     
    		//};
    		// final Timer clignotement = new Timer(500, taskPerformer);
     
    		Button button1 = new Button(group, SWT.NONE);
    		button1.setText("Mode");
    		button1.addSelectionListener(new SelectionAdapter() {
    			public void widgetSelected(SelectionEvent e) {
    				System.out.println("Appui sur le bouton MODE");
    				if (getWatch().getMode() == Mode.SHOWTIME) {
    					group.setText("Adjust hours");
    					display.timerExec(500, timer);
     
    					// clignotement.start();
     
    				} else if (getWatch().getMode() == Mode.ADJUSH) {
    					group.setText("Adjust minutes");
     
    				} else {
    					group.setText("Show time");
    					// clignotement.stop();
    					display.timerExec(-1, timer);
    					text.setVisible(true);
    				}
    				getWatch().getA().click("A");
    			}
    		});
     
    		Button button2 = new Button(group, SWT.NONE);
    		button2.addSelectionListener(new SelectionAdapter() {
    			public void widgetSelected(SelectionEvent e) {
    				getWatch().getB().click("B");
    			}
    		});
     
    		button2.setText("Set");
    		group.pack();
    		shell.pack();
    		shell.open();
     
    		while (!shell.isDisposed()) {
    			shell.update();
    			if (!display.readAndDispatch()) {
     
    				display.sleep();
     
    			}
     
    			this.print();
    		}
    		display.dispose();
    	}
     
    	public void print() {
     
    		text.setText(watch.getHour() + ":" + watch.getMinute());
     
    	}
     
    	public Watch getWatch() {
    		return this.watch;
    	}
     
    }
    merci d'avance.
    Bonne soirée!!

  2. #2
    Membre expérimenté

    Profil pro
    Inscrit en
    Août 2006
    Messages
    218
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Août 2006
    Messages : 218
    Par défaut
    Bonjour,

    Est-ce ton programme fonctionne ?

    Laurent

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 66
    Par défaut
    Avant tout merci de t'interesser à mon problème.

    Oui et non... lol
    Sous windows
    mon horloge fonctionne tant que je n'appuie pas sur les boutons, apres appuie sur 3 fois mode (retour au mode affiche heure) la mise à jour de l'affichage du tps ne se fait plus toutes les secondes(ms toutes les 3-5 sec) à part si je bouge ma souris ou si j'appuie sur n'importe quelle touche du clavier.

    Sous linux
    la mise à jour de l'affichage du tps ne se fait plus toutes les secondes(ms toutes les 3-5 sec) à part si je bouge ma souris ou si j'appuie sur n'importe quelle touche du clavier.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 66
    Par défaut
    Personne ne peut m'aider alors ?

    Merci à tous ceux qui ont essayé.

  5. #5
    Membre expérimenté

    Profil pro
    Inscrit en
    Août 2006
    Messages
    218
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Août 2006
    Messages : 218
    Par défaut
    Peux-tu poster le code de Watch s'il te plait, je regarde cela en détail,

    Laurent

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 66
    Par défaut
    Voici le code intégrale en pièces jointes nettoyer de tout commentaire inutile et essai.

    Merci à toi meddle.
    Fichiers attachés Fichiers attachés

  7. #7
    Membre expérimenté

    Profil pro
    Inscrit en
    Août 2006
    Messages
    218
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Août 2006
    Messages : 218
    Par défaut
    Salut,

    Désolé du retard dans ma réponse, j'ai eu une journée d'hier chargée

    Alors en fait les dysfonctionnements de ton programme vient bien de la boucle

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
            while (!shell.isDisposed()) {
                shell.update();
                if (!display.readAndDispatch()) {
                    display.sleep();
                }
                this.print();
            }
    En SWT, il vaut mieux que ce soit le Thread Watch qui mette à jour le contenu de ton objet Text.

    Donc pour faire cela j'ai modifié :

    Watch

    - Ajout d'un attribut de type text avec Getter et Setter
    - Ajout du code de mise à jour du widget Text dans la méthode incrementMinutes :
    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
        public synchronized void incrementMinutes() {
            this.minute++;
            if (this.minute > 59) {
                System.out.println("minute > 59");
                this.minute = 0;
                this.incrementHours();
    
            }
            if (text.getDisplay() != null && !text.getDisplay().isDisposed()) {
                text.getDisplay().syncExec(new Runnable() {
    
                    public void run() {
                        text.setText(getHour() + ":" + getMinute());
                    }});
            }
    Fenetre

    - Injection dans Watch du widget text :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
            text = new Text(group, SWT.NONE);
            text.setEditable(false);
            text.setBounds(10, 30, 100, 25);
            text.setText("12:46");
            
            // Ajout Laurent
            watch.setText(text);
    - Simplification de la boucle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
            while (!shell.isDisposed()) {
                // Suppression Laurent
                //shell.update();
                if (!display.readAndDispatch()) {
                    display.sleep();
                }
                // Suppression Laurent
                //this.print();
            }
    Et ca marche

    Laurent

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

Discussions similaires

  1. WAS "Unable to read and handle request"
    Par 1ereClasseTac dans le forum Websphere
    Réponses: 4
    Dernier message: 22/02/2010, 15h09
  2. Depth component read and write Oo
    Par Groove dans le forum OpenGL
    Réponses: 1
    Dernier message: 30/03/2007, 12h50
  3. [Nasm][Linux] Open and read
    Par daedric dans le forum x86 32-bits / 64-bits
    Réponses: 1
    Dernier message: 28/07/2006, 12h29

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