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

Java Discussion :

MVC et actualisation IHM


Sujet :

Java

  1. #1
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 36
    Par défaut MVC et actualisation IHM
    Bonjour,

    je dispose d'une application en MVC, dont le fonctionnement est un peu particulier.

    Je génère beaucoup d'instances d'une certaine classe définie observable et faisant un notify() depuis le constructeur. Ceci à pour effet d'appeler la fonction update() de mon contrôleur.

    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
     
    	/**
             * Constructeur à partir d'un MotifValide pere et d'un MotifValide mere
             */
    	public MotifCandidat(MotifValide pere, MotifValide mere){
    		this.pere = pere;
    		this.mere = mere;
    		this.calculerMesures();
    		this.addObserver(Traitement.getObsMemoire());
    		this.mynotify();
    	}
     
    	/**
             * Fonction de notification aux observateurs du modèle
             * fixe l'objet à changed et lance la notification
             */
    	public void mynotify () {
    		this.setChanged();
    		this.notifyObservers();
    	}

    Ce controleur me permet de suivre la consommation mémoire; pour cela, j'ai un champ dans ma vue qui va être rempli par l'update() du contrôleur :
    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
     
    	@Override
    	/**
             * Fonction appelée lorsque la classe est notifiée
             * met à jour les champs sur la fenêtre graphique
             */
    	public void update(Observable o, Object arg) {
    		//Récupération des informations à partir du Runtime
    		long freeMemory = Runtime.getRuntime().freeMemory();
    		long maxMemory = Runtime.getRuntime().maxMemory();
    		long totalMemory = Runtime.getRuntime().totalMemory();
    		//Construction de la chaîne à afficher
    		String toDisplay = "Mémoire utilisée : " +
    							((totalMemory - freeMemory)/1024) +
    							" Ko (" +
    							((totalMemory - freeMemory) * 100 /maxMemory) +
    							"%)"+"     |     Mémoire maximum JVM : "+
    							maxMemory/1024/1024+" Mo";
    		//Récupération de la zone d'affichage et mise à jour
    		this.vue.getFieldInfos().setText(toDisplay);
    	}
    Lorsque je lance ma fenêtre, cette fonction est appelée est affiche correctement les informations sur la vue.
    Lorsque je lance la génération d'un grand nombre d'instances de la classe observable, les informations mémoire de la fenêtre ne sont PAS mises à jour sur la vue.
    Lorsque la génération stoppe, les informations mémoire sont mises à jour sur la vue.

    Du coup, j'ai mis un coup de System.out.println(toDisplay) dans la fonction update() et ... elle est bien appelée lors de la génération en grand nombre, ma chaîne est construite en mémoire mais n'est pas retranscrite sur la vue malgré le setText()

    Des solutions ? Des idées ? Je dois avouer que je ne vois pas trop quoi faire (j'ai essayer de placer un .validate() et un .repaint() après le setText() mais rien n'y fait)...

    Merci d'avance

  2. #2
    Membre confirmé
    Inscrit en
    Mars 2007
    Messages
    179
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 179
    Par défaut
    Bonjour

    Travailles-tu sous un IDE? (Eclipse, ...)?
    Si oui, as-tu essayé de mettre un point de debug dans le setText()?


    En MVC, c'est pas forcément la vue qu'il faut mettre à jour, mais le modèle associé.

    De quel type est ton FieldInfos? Si c'est un JTextField, tu peux peut-être voir du côté de getDocument... ou si tu trouves une fonction nommée getModel ou getDefaultModel.

    Désolé je suis à mon travail, pas bcp le temps, j'espère que çà peut t'aider. Si tu as finalement trouvé, ta solution m'intéresse!

    Nicolas.

  3. #3
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 36
    Par défaut
    En effet, je travaille sous Eclipse (la version est à jour).
    Le setText() associé à un point de Debug ne donne pas grand chose, sinon que les méthodes sont bien appelées et que la chaîne est bien mise à jour en mémoire.

    L'objet à mettre à jour est bien un JTextField, j'ai tenté de le mettre à jour via le getDocument() mais rien à faire

    La seule explication que j'arrive à en faire c'est que ma boucle est très gourmande en temps processeur et qu'elle "bloque" le thread de mise à jour de la vue de Swing...

  4. #4
    Membre confirmé
    Inscrit en
    Mars 2007
    Messages
    179
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 179
    Par défaut
    J'avais pas pensé à çà, c'est peut-être une histoire de thread.
    Et si vous le lancez que quelques petites fois?

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Décembre 2007
    Messages : 71
    Par défaut
    bonsoir
    si tu as utilisé swing pour réaliser ton IHM la mise a jour de la vue doit etre hériter de la classe swingworker (c le même cas d'un JProgressbar)
    aprés tu doit définir la méthode doInBackground()

  6. #6
    Membre confirmé
    Inscrit en
    Mars 2007
    Messages
    179
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 179
    Par défaut
    Il faut forcément passer par Swing Worker pour mettre à jour le JTextField? En gros le SwingWorker va créer un thread parallèle, c'est çà?

  7. #7
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Décembre 2007
    Messages : 71
    Par défaut
    SwingWorker permet de faciliter la transmission de messages entre un thread de calcul et l'EDT(l'EventDispatchThread).Il suffit de définir la méthode qui fait le calcul en arrière-plan, de décrire les messages à transmettre à l'EDT et de définir les actions à effectuer dans l'EDT à la réception de ces messages.

    pour plus de détaille voila

  8. #8
    Membre confirmé
    Inscrit en
    Mars 2007
    Messages
    179
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 179
    Par défaut
    Nice!
    Ca a l'air beau.

  9. #9
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 36
    Par défaut
    En effet ça pourrait être ma solution.

    J'essaie ça et je vous donne les résultats

    Merci.

  10. #10
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 36
    Par défaut
    Et non ^^ Ça ne change rien au problème malheureusement. Tant pis, je vais laisser ça comme ça pour l'instant je pense, on verra lors d'une version 2.0 de mon application

  11. #11
    Membre confirmé
    Inscrit en
    Mars 2007
    Messages
    179
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 179
    Par défaut
    Etrange que çà ne marche pas...
    Je me rappelle pourtant à l'époque avoir utilisé le SwingWorker et effectivement çà avait résolu mes pbs de rafraichissement...

Discussions similaires

  1. [MVC] Actualiser la vue en écoutant le modèle
    Par dolcevita755 dans le forum Interfaces Graphiques en Java
    Réponses: 7
    Dernier message: 25/03/2012, 16h12
  2. Réponses: 4
    Dernier message: 24/02/2009, 12h06
  3. [CR7]Actualisation des données depuis VB
    Par elifqaoui dans le forum SDK
    Réponses: 4
    Dernier message: 24/11/2003, 13h44
  4. Actualisation d'une liste "dépendante".
    Par Trilby dans le forum ASP
    Réponses: 6
    Dernier message: 19/11/2003, 18h39
  5. Classe abstraite / MVC
    Par caramel dans le forum MVC
    Réponses: 5
    Dernier message: 01/04/2003, 09h27

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