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 :

[JFACE] Récupérer index d'un tableviewer sur event


Sujet :

SWT/JFace Java

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2012
    Messages
    106
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Juillet 2012
    Messages : 106
    Points : 63
    Points
    63
    Par défaut [JFACE] Récupérer index d'un tableviewer sur event
    Bonjour,

    débutant sur JFACE, je cherche le moyen de récupérer dans un listener d'un bouton, la valeur d'une cellule précise. Pour l'instant je n'arrive qu'à récupérer la ligne complète en utilisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IStructuredSelection selection= (IStructuredSelection) viewer.getSelection();
    Quelqu'un pourrait m'expliquer comment faire ?



    Merci

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    La sélection que tu obtiens ne contient pas vraiment des lignes mais les instances que le Content Provider fournit à partir de l'input donné au viewer. On ne récupère donc pas de cellule ou de lignes, mais des instances dont on va chercher des propriétés.

    Tu as toujours la possibilité de récupérer les valeurs réellement affichées en passant par le Label Provider.

    Mettons par exemple que (je simplifie au max)

    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
    public class MyObject {
     
    	private String name;
    	private String lastname;
    	private Date birthDate;
     
            public MyObject(String name, String lastname, Date birthDate) {
    		this.name=name;
    		this.lastname=lastname;
    		this.birthDate=birthDate;
    	}
     
    	public String getName() {
    		return name;
    	}
     
    	public String getLastName() {
    		return lastname;
    	}
     
    	public Date getBirthDate() {
    		return birthDate;
    	}
     
    }
    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
    public class MyContentProvider implements IStructuredContentProvider {
     
    	public Object[] getElements(Object inputElement) {
    		return (Object[])inputElement;
    	}
     
    	public void dispose() { 
    	}
     
    	private Viewer viewer;
     
    	public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { 
    	}
     
    	protected Viewer getViewer() { 
    	}
     
    }
    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
    public class MyLabelProvider extends LabelProvider implements ITableLabelProvider {
     
    	private final static SimpleDateFormat FORMAT = new SimpleDateFormat("dd/MM/yyyy");
     
    	@Override
    	public Image getColumnImage(Object element, int columnIndex) {
    		return null;
    	}
     
    	@Override
    	public String getColumnText(Object element, int columnIndex) {
    		if ( element instanceof MyObject ) {
    			MyObject myObject = (MyObject)element;
    			switch(columnIndex) {
    			case 0:
    				return myObject.getName();
    			case 1:
    				return myObject.getLastName();
    			case 2:
    				return FORMAT.format(myObject.getBirthDate());
    			}
    		}
    		return null;
    	}
     
    	@Override
    	public String getText(Object element) {
    		return getColumnText(element, 0);
    	}
     
    }
    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
    final TableViewer viewer = new TableViewer(parent);
    viewer.setContentProvider(new DefaultContentProvider());
    viewer.setLabelProvider(new MyLabelProvider());
     
    viewer.addSelectionChangedListener(new ISelectionChangedListener() {
     
       @Override
       public void selectionChanged(SelectionChangedEvent event) {
           IStructuredSelection selection = (IStructuredSelection)event.getSelection(); // ici la sélection est traitée sur évenement, mais c'est exactement la même chose quand tu la récupères par viewer.getSelection(), sauf qu'il faut penser à tester si elle n'est pas vide ( avant de caster (par isEmpty())).
           for(Object object : selection.toList()) { // parcourt des objets sélectionnés
               if ( object instanceof MyObject ) {
                   MyObject myObject = (MyObject) object;
                   Date birthDate = myObject.getBirthDate(); // récupération de la date de naissance de l'élément
                   String name = myObject.getName(); // récupération du nom
                   String stringBirthDate = ((ITableLabelProvider)viewer.getLabelProvider()).getColumnText(myObject, 2); // récupération du contenu affiché dans la colonne
               }
           }
        }
    });
     
    MyObject[] input = new MyObject[] {
       new MyObject("Martin","Jean", FORMAT.parse("9/6/1981")),
       new MyObject("Dupont","Martine", FORMAT.parse("18/11/1994")),
    };
     
    viewer.setInput(input);
    On pourrait accéder directement au contenu des lignes et cellules, via les méthodes de org.eclipse.swt.widgets.Table (instance obtenue par viewer.getTable(), voir viewer.getTable().getSelectionIndices(), TableItem item = viewer.getTable().getItem(index), etc...), mais le but de JFace c'est justement de mettre une abstraction sur la table pour manipuler directement les objets du modèle, et non plus des numéros de lignes, de colonnes, etc... En plus la table ne stocke que des String (ou des Images) : retrouver la donnée dans le bon type pour la manipuler demande en plus des conversions... c'est quand même bien plus simple de travailler avec ses classes métier.

  3. #3
    Membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2012
    Messages
    106
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Juillet 2012
    Messages : 106
    Points : 63
    Points
    63
    Par défaut
    Merci, pour ton aide, mais en fait le modèle que j'utilise n'est pas celui là, mais avec un EditingSupport, j'arrive bien comme tu dis à récupérer mon objet métier et non des indices grâce à jface. Mon problème ne réside pas vraiment là.

    Mon but final, est de pouvoir éditer un chemin de dossier se trouvant dans 1 cellule de ma table.
    ma manière de procéder pour l'instant est celle ci

    1 Sélection de la cellule
    2 je clique sur un bouton hors table Chemin
    3 le bouton ouvre un FileDialog
    4 le chemin sélectionné s'enregistre dans la table

    Actuellement lorsque je récupère la donnée dans le listener du bouton je n'ai que l'objet complet, et pas la sélection de ma cellule.

    Comme il y a forcément plusieurs chemins dans mon objet, j'aimerais ciblé le bon attribut et aussi proposer un Directory ou fileDialog selon le chemin

    Pour l'instant je passe par une variable globale, mais c'est inélégant au possible

    Aurais tu une idée

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Il n'y a pas forcément corrélation entre cellule éditée et sélection.

    A mon avis, il vaudrait mieux personnaliser le CellEditor (en étendant la classe). Par exemple, tu fais un handler, dont tu gères une instance unique, passée au celleditor. Tu redéfinies activate(ColumnViewerEditorActivationEvent activationEvent) (et deactivate) ce qui te permet de récupérer ligne et colonne éditée, que tu donnes au handler.

    Le bouton par le handler peut connaitre la cellule éditée. Le handler permet également d'injecter le chemin choisi dans le FileDialog, directement dans la cellule éditée (comme si on le tapait à la main dedans).

    On pourrait aussi faire un FileCellEditor qui encapsule complètement ce fonctionnement : tu lui passes juste la référence du bouton externe, ce qui permet en plus d'en gérer l'activation, l'interaction, etc... Tu peux aussi regarder le code du DialogCellEditor et du ColorCellEditor : le bouton est intégré à l'éditeur, mais tu verras le principe.

  5. #5
    Membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2012
    Messages
    106
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Juillet 2012
    Messages : 106
    Points : 63
    Points
    63
    Par défaut
    Chouette, merci beaucoup pour les pistes

    n'y connaissant pas grand chose, ça va me faire de la lecture

  6. #6
    Membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2012
    Messages
    106
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Juillet 2012
    Messages : 106
    Points : 63
    Points
    63
    Par défaut
    Merci, j'ai copié le snippet du TextAndDialogCellEditor en modifiant un InputDialog par un FileDialog et hop ça a marché !
    Il faut que je fasse quelques réglages encore mais c'est exactement ce qu'il me fallait

    c'est mieux que la boue que j'avais proposé au départ

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 12/10/2011, 11h48
  2. [SWT/JFace] Récupérer les icônes du système
    Par Wookai dans le forum SWT/JFace
    Réponses: 7
    Dernier message: 07/09/2010, 13h31
  3. Réponses: 8
    Dernier message: 22/04/2009, 16h54
  4. Réponses: 2
    Dernier message: 25/10/2005, 11h51
  5. Réponses: 2
    Dernier message: 20/08/2004, 18h10

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