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 :

TableViewer et image


Sujet :

SWT/JFace Java

  1. #1
    Membre averti
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2006
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 12
    Par défaut TableViewer et image
    Bonjour,

    Mon tableViewer alimente mon tableau. Mon tableviewer a comme entrée un modèle basé sur une liste de tableau de String.

    Soit List<String[]>

    Chaque ligne du tableau (chaque String[] dans le modèle) contient une valeur booléenne qui est représentée par une image qui est une icone rouge si la valeur est "false" et une icone verte si la valeur est "true"

    Au départ, toutes les lignes sont à "false" (image rouge). Je parcours avec une boucle for les lignes et je mets "true" à la bonne colonne.

    Je souhaite trouver un moyen de mettre à jour la fenêtre et donc de changer l'image en image verte..

    Pour ça je modifie mon modèle, c'est à dire le tableau String[] et je tente de rafraîchir ma vue.

    Le problème est que mon affichage transforme mon image rouge en verte seulement à la fin de ma boucle for et non à chaque iteration.

    Donc à la fin du parcours de toutes les lignes du tableau j'ai toutes mes lignes qui passent au vert d'un coup !

    Je vous donne un bout du code du MODELE, c'est une liste de tableau de chaînes de caractères (string[]) :
    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
     
    	//-------------------Création des éléments du modèle
    	List<String[]> elements;
    	public MyModele()
    	{
    		elements = new ArrayList<String[]>();
    		//j'aoute cinq lignes à ma listes
    		for (int i = 0 ; i<5 ; i++)
    		{
    			String[] row = {"col0", "col1", "col2", "col3", "col4", "false"};
    			elements.add(row);
    		}
     
    	}
    	//-----------------------Création des images.
    	static Display display = null;
    	static ImageRegistry imageRegistry;
     
    	static 
    	{
    		display = Display.getDefault();//new Display();
    		imageRegistry = new ImageRegistry(display);
     
    		imageRegistry.put("Finished", new Image(display, myModele.class.getResourceAsStream("/files/img/finished.gif")) );
    		imageRegistry.put("NotFinished", new Image(display, myModele.class.getResourceAsStream("/files/img/notfinished.gif")) );
    	}
     
    	public static Image getFinishedImage(boolean b)
    	{
    		if (b)
    			return (Image)(imageRegistry.get("Finished"));
    		else
    			return (Image)(imageRegistry.get("NotFinished"));
    	}
    Je vous donne le bout de code du CONTROLEUR réalisant la modification :

    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
     
    	List<String[]>  myModele = (List<String[]>)(theView.getModel());
     
    	//analyse each table row
    	for (String[] row : myModel)
    	{
    		row[5] = "true";  //la colonne avec l'image change d'état
     
    		final String[] rr = row;
    		display.syncExec(new Runnable()
    		{
    			public void run()
    			{
    				theView.getTableViewer().refresh();
    			}
    		});
     
    		//Un petit sleep sinon ça va trop vite pour l'oeil :-)		
    		try {
    			Thread.sleep(500);
    		} 
    		catch (Throwable th) {}
     
    		System.out.println("\t This line is finished");
    	} //end for
    J'aimerai que mon image soit changée à chaque iteration comme le code le demande mais mon affichage est mis à jour seulement après traitement de toutes les lignes. Comment puis-je y remédier ?




    Ici le CONTENTPROVIDER :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    public class MyModeleContentProvider implements IStructuredContentProvider 
    {
     
    	public Object[] getElements(Object inputElement)
    	{
    		List myList = (List) inputElement;
    		return myList.toArray();
    	}
     
    	public void inputChanged(Viewer viewer, Object old_object, Object new_object){}
     
    	public void dispose() {}
    }
    Ici le LABELPROVIDER :
    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
     
    public class MyModeleProvider implements ITableLabelProvider {
     
    	public String getColumnText(Object element, int columnIndex) {
    		String[] row = (String[])element;
     
    		if (columnIndex != 5 )
    			return row[columnIndex]; //Si c'est la colonne avec le booléen je mets une image.
     
    		return "";
    	}
     
     
     
    	public void dispose() {}
     
    	public Image getColumnImage(Object element, int columnIndex)
    	{
    		String[] row = (String[])element;
     
    		if (columnIndex == 5)
    		{
    			return MyModele.getFinishedImage(Boolean.valueOf(row[columnIndex]));
    		} 
    		return null;
    	}
     
    	public boolean isLabelProperty(Object element, String property){return false;}
     
    	public void addListener (ILabelProviderListener l){}
     
    	public void removeListener (ILabelProviderListener l){}
    }
    Merci pour vos prochaines réponses.

  2. #2
    Membre chevronné Avatar de desert
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    414
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2007
    Messages : 414
    Par défaut
    Pourquoi ne pas plutôt créer ta propre classe plutôt qu'un tableau de String étant donné que tu cherches à manipuler un booléen ?
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public class MaClasse {
       String valeurColonne1;
       String valeurColonne2;
       boolean image;
       ...
    }
    Ensuite, tu crées ta liste contenant des objets de type MaClasse et tu l'alimentes.
    Une fois dans ton LabelProvider, tu vérifies si le booléen de ton objet de type MaClasse est à true. Si oui, tu renvoie ton image verte sinon ton image rouge.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if (monObjet.getImage() == true) {
       return new Image(display, "chemin_vers_l'image_verte.gif";
    } else {
       return new Image(display, "chemin_vers_l'image_rouge.gif";
    }

  3. #3
    Membre averti
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2006
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 12
    Par défaut
    @Desert

    Merci de ta réponse. Créer cet objet est effectivement une optimisation possible et j'y jetterai un oeil.

    Concernant mon soucis de rafraîchissement, j'ai trouvé une discussion qui a l'air de concorder. La solution proposée est de modifier le ContentProvider et de lui faire implémenter l'interface ContentChangeListener :

    com.bttlindia.tradestart.quoteservice.ContentChangeListener

    qui ne viendrait pas de la java doc. Je pense que c'est une interface avec un nom arbitraire que l'on doit soit même créer.

    Voici le lien :

    http://dev.eclipse.org/newslists/new.../msg03144.html

    Merci pour les futures réponses.

  4. #4
    Membre chevronné Avatar de desert
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    414
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2007
    Messages : 414
    Par défaut
    Si j'ai bien compris, ce que tu souhaites faire, c'est de pouvoir voir le changement d'état de l'image (donc passant du rouge au vert) de chaque ligne modifiée du TableViewer ?
    Dans ce cas, ce que tu devrais faire, c'est de ne rafraîchir qu'une ligne à la fois et non tout le tableau en entier.
    Donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    theView.getTableViewer().refresh(row);
    au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    theView.getTableViewer().refresh();
    Et placer également ton Thread.sleep(500) à l'intérieur de ta fonction run().

  5. #5
    Membre averti
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2006
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 12
    Par défaut Trouvé
    Merci de ta réponse

    Le refresh(row) est effectivement intéressant.

    Comme précisé dans mon message précédent, je suis allé sur le lien
    http://dev.eclipse.org/newslists/new.../msg03144.html

    et j'ai remarqué mon erreur : lorsque je faisais
    Je ne modifiais pas explicitement la donnée.
    J'ai donc ajouté une fonction dans mon modèle de données qui utilisait le numéro de la ligne et les nouvelles valeurs en paramètres et je modifiais ainsi proprement mon modèle.

    Maintenant le refresh passe et je vois effectivement mon état changer et l'image aussi !

    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
     
    	List<String[]>  myModele = (List<String[]>)(theView.getModel());
     
    	int i = 0; //suivre le rang pour modifier la donnée		
     
    	//analyse each table row
    	for (String[] row : myModel)
    	{
    		String[] newValues = new String[6];
    		newValues[5] = "true"; // un tableau avec LA ou Les nouvelles valeurs
    		myModel.modifier(i, newValues); 
     
    		display.syncExec(new Runnable()
    		{
    			public void run()
    			{
    				theView.getTableViewer().update(myModel.get(i));
    						//udpate permet de ne rafraîchir 
    						// que l'object en paramètre. Très pratique
    			}
    		});
     
    		System.out.println("\t This line is finished");
    	} //end for
    Je mets la discussion en résolu.
    A plus !

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

Discussions similaires

  1. Aligné image dans un tableViewer
    Par jm49 dans le forum SWT/JFace
    Réponses: 2
    Dernier message: 02/05/2009, 13h14
  2. [iPhone SDK] Image cellule dans un tableview
    Par dim971 dans le forum Apple
    Réponses: 3
    Dernier message: 31/08/2008, 11h33
  3. Resize d'une image
    Par Anonymous dans le forum C
    Réponses: 6
    Dernier message: 13/07/2008, 22h23
  4. lire une image au format RAW
    Par Anonymous dans le forum OpenGL
    Réponses: 5
    Dernier message: 20/05/2002, 00h11
  5. Création image BMP
    Par Anonymous dans le forum C
    Réponses: 2
    Dernier message: 25/04/2002, 16h04

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