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

  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

  8. #8
    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
    ok merci beaucoup laurent je comprend mieux maintenant comment tout fonctionne cependant le but de ne pas faire intervenir d'import SWT dans Watch était, je ne sais pas si tu connais de mettre en place le Design Pattern Observer pour rendre indépendant le code de l'UI de celui de Watch.

    Dsl de te déranger encore une fois mais question est comment faire si le c'est le Thread de Watch qui doit modifier le text ?

    En tout cas merci de ta réponse tres rapide et précise

  9. #9
    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,

    Alors pour implémenter le Design Pattern Observer, la première idée serait de créer une interface :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public interface Observateur {
        public void actualiser(Observable o);
    }
    Et d'étendre le widget Text :
    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
     
    public class TextWithObserver extends Text implements Observateur {
     
        public TextWithObserver(Composite c, int mode) {
            super(c, mode);
        }
     
        public void actualiser(final Observable o) {
            if (this.getDisplay() != null && !this.getDisplay().isDisposed()) {
                this.getDisplay().syncExec(new Runnable() {
     
                    public void run() {
                        setText(o.getValueAsString());
                    }
                });
            }
        }
     
    }

    Problème : On ne peut pas étendre les widgets SWT, si tu fais cela tu as une belle SWTException...

    La seule solution consiste à étendre Composite, et ce composite contient le widget Text... C'est assez fastidieux car il faut surcharger TOUTES les méthodes qui peuvent être utiles : pack, setvisible, getVisible, computesize...

    En pièce jointe il y a toutes les classes qui vont bien !

    Heureusement, il existe le package JFace qui peut t'aider car il implémente le pattern MVC sur les widgets SWT.

    A bientôt

    Laurent

  10. #10
    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
    Je n'aurai pu rever réponse plus complète merci à toi laurent pour toute ces précieuses et précises informations!

    Bonne continuation encore merci.

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6
    Par défaut SWT MVC
    Bonjour, je travaill actuellement sur une interface SWT pour un système embarqué sur lequel s'execute une plate forme OSGI.
    Je dois séparer l'affichage du comportement du Widget, des Actions de l'utilsateur et des modeles.
    Je vais implémenter le pattern Observable et Commande.
    Je ne peut pas utiliser Jface ni RCP.
    Pourriez vous m'envoyer le fichier joint donc vous parlez sur le thread.
    Merci
    Eric

  12. #12
    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 Eric,

    Que cherches-tu à faire? Des widgets pilotables par MVC ? Des actions ?
    Peux-tu être plus précis ?

    Laurent

  13. #13
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6
    Par défaut
    Bonjour Laurent,

    Je dois réaliser une librairy graphique sous SWT, pour construire des applications qui vont s'exécuter sur une dalle tactile de 640x480 pixels.

    Les Application sont définies sous forme de bundle (OSGI).
    Il s'execute sur une plate forme OSGI embarquée dans dans véhicule.

    Les widgets vont recevoir des évènenemts de la plate Forme.
    Par example niveau du signale Wif, GPRS, arrivée d'un message, j'ai classé ça dans des windgets de type Témoin.

    D'autre button déclencherons des actions utilisateur, affichage d'un itinéraire etc..

    D'autre par un windget peut avoir un automate comportematale associé. Ex 3 bouton représentant des fonctions, un seule boutonpeutêtre actif à la fois.

    Je voudrais séparer les actions déclechée par les utilisateurs des widgets et de leurs automates comportementale.

    Dé plus je souheterai définir des composants réutilisable sous forme de Composite.

    Le but est de pouvoir construire des application en SWT sur la plate forme qui utilise la librairy graphique.

    J'ai fait un essai (non charté), j'aimerais le découper en Composite pour construire l'application plus facilemment et séparer les responsabilités.

    Ci-joint l'essai.

    Merci de ton attention Laurent.

    Eric
    Fichiers attachés Fichiers attachés

  14. #14
    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

    Ok c'est bien clair,

    Je t'invite à regarder ce liens qui t'aidera :
    http://swtmvcwrapper.sourceforge.net/

    Bon courage,

    Laurent

  15. #15
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6
    Par défaut
    Merci Laurent,

    Pour la prelière Iteration du projet je cherche juste à imlplémpenter le Pattern Observer Observebale.

    J'ai un sujet mon modele, un observateur mon Composite et un Timer pour la mise à jours du Modele.

    Lorsque j'execute le Timer se lance correctement, par contre dès que le Modele change, la méthode update de mon composite récupere mon modele et essaye d'appeler la methode modele.getHeure une exception est levée.
    Exception in thread "main" java.lang.IllegalArgumentException: Argument cannot be null

    Je t'envoie mon code par mail pour plus de confidentialité.

    Merci
    Eric

  16. #16
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6
    Par défaut Resolue
    J'avait une instance nulle dans le modele getDate() au premier appel de setHeure();

    Merci

+ 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