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

Eclipse Platform Discussion :

swt TableViewer rafraichir dès qu'un object et modifié


Sujet :

Eclipse Platform

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Février 2006
    Messages
    310
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 310
    Par défaut swt TableViewer rafraichir dès qu'un object et modifié
    bonjour à tous,


    j'explique mon problème :

    j'ai une liste d'objet (ArrayList<Object>)qui est une attribut de classe d'une classe nommée Simulation, cette liste d'objet est modifié tout au lont de l'execution de mon programme.

    coté graphique (application RCP) j'ai une view qui contient une Table que est chargé d'afficher differentes informations de chacun des objets de ma liste d'objet precedente.



    ma question est comment faire pour mettre à jour automatiquement ma Table dès que ma liqte d'objet est odifié.


    j'espère avoir été clair


    merci à vous

  2. #2
    Membre éclairé
    Inscrit en
    Février 2006
    Messages
    310
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 310
    Par défaut
    je me suis inspiré de ce code :

    http://www.java2s.com/Code/Java/SWT-...ellEditors.htm


    j'ai bien compris de le fait qu'il fallait definir un contentProvider et un labelProvider pour le TableWiever


    mais dans l'example si dessus ils rafraichissent la table aprés y avoir ajouter un element hors je voudrais que le rafraichissement se fasse automatiquement
    des q'un element est ajouté dans l'INPUT associée à la tableViewer

    ceci est-il possible ? et si oui quel est la marche a suivre ?

  3. #3
    Membre éclairé
    Inscrit en
    Février 2006
    Messages
    310
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 310
    Par défaut
    j'ai essayé une petite "magouille" :

    j'ai ajouté un listener sur mon table viewer pour que dit que la souris bouge je rafraichisse sont contenu

    mais ceci est une vrai magouille puisque que rien ne se rafraichit su je ne bouge pas la souris y aurait-il une solution plus "Vrai"


    je m'en remet a vous si vous avez une idée, je suis prenneur

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 35
    Par défaut
    je pense qu'une solution consiste à exploiter le pattern Observer/Observable

    commence par créer cette classe dans un package d'utilitaire.

    (si jamais il existe une classe de ce genre dans java.* ou org.apache.* ou autre assez générique; je suis preneur, ça éviterai de la redéfinir à chaque projet)

    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
     
    import java.util.Observable;
     
    /**
     * wraps an element, objects then turns from instance to Wrapper's state <br/>
     * that solve object reference changes <br />
     * Wrappers are also observable, so use of setter triggers observers notification for change
     * @param <T> the type of the object to wrap
     */
    public class Wrapper <T> extends Observable{
     
    	private T element;
     
    	public Wrapper() {
    	}
     
    	public Wrapper(T element) {
    		this.element = element;
    	}
     
    	/**
             * @return the element
             */
    	public T getElement() {
    		return this.element;
    	}
     
    	/**
             * @param element the element to set
             */
    	public void setElement(T element) {
    		this.element = element;
    		this.setChanged();
    		this.notifyObservers(element);
    	}
     
    	public String toString() {
    		return "["+(null == element ? "NULL" : "("+element.getClass()+") "+element.toString())+"]"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
    	}
    La wrapper va servir à contenir ton objet qui change (ta liste).
    A chaque fois que ta liste (ou un objet de la liste) est modifié,
    (à toi de gérer comment)
    tu dois faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    wrapper.setElement(list);

    La classe qui instancie le viewer (WizardPage, View, Composite) doit implémenter l'interface Observer.
    L'instance doit s'ajouter en tant qu'observer du wrapper (=> des modif de son contenu)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    wrapper.addObserver(this);

    La classe doit implémenter la méthode update (Observer)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public void update(Observable o, Object data){
      if(o == wrapper){ /* l'observer  peut observer différentes choses
      donc il faut identifié qui envoie la notification
    */
          viewer.setInput(wrapper.getElement(); /* mise à jour du viewer */
      }
     
    }
    tu peux aussi mettre le setInput dans un Display.asyncExec pour que ça rame pas trop.

    et pendant qu'on est dans les threads: le setInput doit être appelé par le même thread qui a créé les composants.
    => si c'est un autre thread qui met à jour le wrapper (la liste), ça deviens nettement plus compliqué.

    très important:
    dans le dispose de ton (WizardPage, View, Composite) il faut enlever l'observer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    wrapper.deleteObserver(this);
    très important aussi:
    si la classe est un Composite, son parent(WizardPage, View) doit appeler explicitement son dispose.

    à toi de voir comment tu amène le Wrapper à portée du viewer (dans le composite).

    voilà, j'espère que j'ai été assez clair

    attention: si il y a vraiment beaucoup de donnée, c'est pas génial de recharger la liste entière dans le viewer pour le peu de modif.
    Il faut voir pour faire des mises à jour plus localisées.

  5. #5
    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
    Bonjour,

    blackwizard ce que tu decris, c'est l'idee de JFace Databinding, qui est un moteur de binding ou tu peux binder des UI SWT avec des Bean, POJO, EMF, DOM, Object Javascript... Il te gere le binding avec les validations a effectuer, les conversions de données (ex : on tappe un entier (en String) dans un champs SWT Text et ca met a jour un Bean qui a un setter en Integer).

    Il faut un certain temps pour s'y mettre pour comprendre tous ses concepts (Realm, Binding, Observable...), mais une fois que l'on a compris c'est super puissant.

    Je croies qu'il existe un ContentProvider dans JFace Databinding pour binder une Table a une liste de Bean, mais je n'arrive plus a retrouver la classe.

    Mais par contre un concept important est de pouvoir observer les ajouts des tes Bean dans les ArrayList. La ca ne sera pas magique et il faudra que tu gere le declenchement des evts (PropertyChangeEvent par ex) pour indiquer au moteur d ebinding que la liste a ete modifiee (ajour item, suppression item). Si tes Bean sont en EMF t'as pas besoin de gerer ca, EMF te genere toute la tuyauterie de declenchement d'evenement.

    Bon courage

    Angelo

    Angelo

  6. #6
    Membre éclairé
    Inscrit en
    Février 2006
    Messages
    310
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 310
    Par défaut
    Citation Envoyé par azerr Voir le message
    Je croies qu'il existe un ContentProvider dans JFace Databinding pour binder une Table a une liste de Bean, mais je n'arrive plus a retrouver la classe.
    pour mapper correctement les donnée en fonctoin d'un objet idefinir le contentProvider et le labelProvider de la table et modifié son Input par l'objet que l'on souhaite.

    ceci est fait correctement je n'ai pas de probleme pour afficher un objet de type "NewObject" dans le table.

    mono soucis c'est que j'ai ma couche metier (independante de sw, hface,ecipse,..) de mon application qui fait evoluer au cours de l'application une liste de "NewObject" et que je souhaiterais que des que cette liste est modifié ma table se mette a jour.

    je vais regardé sur la possibilité d'ajouter un design pattern oberserv-observable sur la liste de ma cuoche metier

    merci encore pour votre aide

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

Discussions similaires

  1. [SWT][JFACE][TableViewer]BackgroundColor du header
    Par pssst dans le forum SWT/JFace
    Réponses: 4
    Dernier message: 06/08/2014, 15h12
  2. [SWT/JFace] Filtre sur un TableViewer.
    Par Gueritarish dans le forum SWT/JFace
    Réponses: 0
    Dernier message: 28/05/2009, 16h14
  3. Patterns pour Jface/Swt (treeViewer et tableViewer)
    Par papaetoo dans le forum Design Patterns
    Réponses: 0
    Dernier message: 23/04/2009, 17h43
  4. SWT - Tableviewer et alignement de CellEditor
    Par Bacteries dans le forum SWT/JFace
    Réponses: 2
    Dernier message: 08/10/2008, 15h04
  5. [SWT] TableViewer Afficher un Composite dans une cellule
    Par ShakaZulu dans le forum SWT/JFace
    Réponses: 3
    Dernier message: 30/08/2006, 18h45

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