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 :

[debutant][swt] CellEditor / CellModifier avec double clic


Sujet :

SWT/JFace Java

  1. #1
    Membre à l'essai
    Inscrit en
    Juillet 2003
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 14
    Points : 11
    Points
    11
    Par défaut [debutant][swt] CellEditor / CellModifier avec double clic
    Bonjour,

    Je suis en train de developper une application en SWT utilisant une TableViewer contenant une Table.

    Mon probleme est que la modification d'une cellule se fait avec un seul clic , ce qui veut dire juste quand on la selectionne.

    Ce que je voudrais, c'est selectionner la ligne du tableau, et si je fais un double clic dans la cellule, pouvoir la modifier.

    Voici mon code actuel :
    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
    TableViewer tableViewer = new TableViewer(tableComposite, SWT.FULL_SELECTION | SWT.BORDER | SWT.HIDE_SELECTION);
    tableViewer.setContentProvider(new EmailContentProvider());
    tableViewer.setLabelProvider(new EmailLabelProvider());
    tableViewer.setInput(emailList);
     
    Table table = tableViewer.getTable();
    table.setHeaderVisible(true);
    table.setLinesVisible(true);
     
    ...
    Ajout des TableColumn
    ...
     
    CellEditor[] editors = new CellEditor[5];
    editors[0] = new TextCellEditor();
    editors[1] = new TextCellEditor(table);
    editors[2] = new TextCellEditor(table);
    editors[3] = new TextCellEditor(table);
    editors[4] = new ComboBoxCellEditor(table, getEmailActions(),SWT.READ_ONLY);
     
    tableViewer.setColumnProperties(PROPS);
    tableViewer.setCellEditors(editors);
    tableViewer.setCellModifier(new EmailCellModifier(tableViewer));
    Je ne mets pas ici le ContentProvider ni le LabelProvider qui ne sont pas utiles (enfin j'espere).

    Par contre, le cellModifier:
    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
    class EmailCellModifier implements ICellModifier {
    private Viewer viewer;
     
    public EmailCellModifier(Viewer viewer) {
        this.viewer = viewer;
    }
     
    public boolean canModify(Object element, String property) {
        return true;
    }
     
    public Object getValue(Object element, String property) {
        Email email = (Email) element;
     
        if (Constants.EMAIL_ACCOUNT_NAME.equals(property)) {
            return email.getAccountName();
        ...
    }
     
    public void modify(Object element, String property, Object value) {
        if (element instanceof Item) {
            element = ((Item) element).getData();
        }
     
        Email email = (Email) element;
     
        if (Constants.EMAIL_ACCOUNT_NAME.equals(property)) {
            email.setAccountName((String) value);
        ...
        viewer.refresh();
    }
    }
    Je pense que la methode canModify() peut etre interessante car quand je retourne False, il n'y a que la selection de la ligne.

    En fait, je me demande si mon probleme ne pourait pas etre resolu si je pouvais savoir quand un simple ou double clic a ete fait dans la cellule.

    Merci d'avance.

  2. #2
    Membre à l'essai
    Inscrit en
    Juillet 2003
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 14
    Points : 11
    Points
    11
    Par défaut
    Bon, j'ai progresse, mais je suis pas satisfait de ma demarche.

    Donc si quelqu'un a mieux, je suis prenneur.


    Dans la classe interne EmailCellModifier, j'ai rajoute une variable interne col (colonne) et un accesseur (seulement le GET, nous n'avons pas besoin du SET)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    private in col = -1;
     
    public int getCol(){
        return col;
    }
    J'ai ensuite modifie la methode canModify() par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public boolean canModify(Object element, String property) {
        if (Constants.EMAIL_ACCOUNT_NAME.equals(property)) {
            col = 0;
        } else if (Constants.EMAIL_PERSON.equals(property)) {
            col = 1;
        ...
        } else {
            col = -1;
        }
        return false;
    }
    Dans tous les cas, je retourne false. Comme ca, la cellule ne pourra jamais etre modifiee. Les constantes EMAIL... sont les en-tetes de ma table.

    Enfin, je rajoute un DoubleClickListener sur la TableView
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    tableViewer.addDoubleClickListener(new IDoubleClickListener() {
        public void doubleClick(DoubleClickEvent event) {
            TableViewer tblv = (TableViewer)event.getViewer();
            int col = ((EmailCellModifier)tblv.getCellModifier()).getCol();
            if(col>-1){
               // Traitement en fonction de la colonne
            }
        }
    });
    Il ne me reste plus qu'a connaitre la ligne pour creer un nouveau CellEditor sur la cellule.

    Je suis toujours a la recherche de quelque chose de plus "propre".

    Merci

  3. #3
    Membre à l'essai
    Inscrit en
    Juillet 2003
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 14
    Points : 11
    Points
    11
    Par défaut
    Pour la ligne j'ai egalement trouve quelque chose.

    Dan le EmailCellModifier, j'ai rajoute
    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
    private int row = -1;
     
    public int getRow(){
        return row;
    }
     
    private int findRow(Email email){
        int row = -1;
        row = emailList.lastIndexOf(email);
        return row;    
    }
     
    public boolean canModify(Object element, String property) {
        ...
        row = findRow((Email)element);
        return false;
    }
    Le findRow parcourt ma liste (mise en parametre du tableViewer). C'est assez rapide (pour une liste de 2500 objets environs), mais je pense qu'il y a mieux.

    Enfin, je rajoute dans le DoubleClickListener
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int row = ((EmailCellModifier)tblv.getCellModifier()).getRow();
    Normalement avec ca, je dois pouvoir rajouter un CellEditor.

    Tous commentaires sont bienvenus.


    ben

Discussions similaires

  1. Pas de lancement avec double-clic sur un JAR avec Mac OS 10.8.2
    Par #define dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 21/10/2012, 19h35
  2. Sélection avec double clic
    Par cmail dans le forum IGN API Géoportail
    Réponses: 4
    Dernier message: 23/04/2012, 10h36
  3. Réponses: 2
    Dernier message: 14/03/2012, 13h32
  4. [debutant]remplir un champs txt avec un clic bouton
    Par Zen_Fou dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 01/06/2006, 17h07

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