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 :

Binder les checkbox d'un CheckBoxTreeViewer


Sujet :

SWT/JFace Java

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2012
    Messages : 10
    Points : 7
    Points
    7
    Par défaut Binder les checkbox d'un CheckBoxTreeViewer
    Bonjour à tous,

    Je dispose d'un arbre à checkbox, avec des colonnes (CheckBoxTreeViewer) où chaque nœud représente un objet du modèle.
    Un objet possède des attributs dont certains sont représentés dans les colonnes de l'arbre.
    Chaque objet possède aussi un booléen, représenté par la checkbox de chaque nœud de l'arbre

    Autant je réussi à binder les attributs présents dans les colonnes, autant je ne saisis pas comment binder les checkbox sur ce booléen .

    Pour le moment j'ai mis en place un provider pour le contenu sur mon CheckBoxTreeViewer, des providers pour gérer l'affichage de mes colonnes (un par colonne) et enfin un provider de l'état de mes checkbox (implémentation de ICheckStateProvider) où je mets manuellement à jour le booléen sur mes objets.

    Au final, je voudrais qu'à l'affichage de ma vue l'arbre soit initialisé, i.e. que des checkbox soient cochées, en fonction d'un attribut de type booléen présent sur mes objets.
    Et si je coche/décoche que le booléen soit automatiquement mis à jour dans l'objet.

    Si quelqu'un a des idées sur le sujet, je suis preneur.

  2. #2
    Membre expert
    Avatar de Gueritarish
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2007
    Messages
    1 800
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 800
    Points : 3 919
    Points
    3 919
    Par défaut
    Salut,

    Je ne sais pas si ça correspond exactement à ce que tu souhaites obtenir, mais en tout cas, voici un snippet qui binde l'état coché ou non à une propriété d'un POJO:
    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    public class BindingSnippet {
      private static class MyModel {
     
        private final String name;
     
        private boolean folder;
     
        public MyModel(final String aName, final boolean aFolderFlag) {
          name = aName;
          folder = aFolderFlag;
        }
     
        /**
         * @return the name
         */
        public String getName() {
          return name;
        }
     
        /**
         * @return the isFolder
         */
        public boolean isFolder() {
          return folder;
        }
     
        /**
         * @param aFolderFlag
         *          the isFolder to set
         */
        public void setFolder(final boolean aFolderFlag) {
          this.folder = aFolderFlag;
        }
      }
     
      public static void main(final String[] args) {
        final Display display = new Display();
        final File root = new File("/");
        final File[] listNames = root.listFiles();
        final MyModel[] models = new MyModel[listNames.length];
        int i = 0;
        for (final File file : listNames) {
          models[i] = new MyModel(file.getName(), file.isDirectory());
          i++;
        }
     
        Realm.runWithDefault(SWTObservables.getRealm(display), new Runnable() {
          @Override
          public void run() {
            final Shell shell = new Shell(display);
            shell.setLayout(new GridLayout(1, false));
     
            final CheckboxTableViewer viewer =
              CheckboxTableViewer.newCheckList(shell, SWT.SINGLE | SWT.H_SCROLL
                  | SWT.V_SCROLL);
     
            viewer.setCheckStateProvider(new ICheckStateProvider() {
     
              @Override
              public boolean isChecked(final Object element) {
                return ((MyModel) element).isFolder();
              }
     
              @Override
              public boolean isGrayed(final Object element) {
                return false;
              }
            });
            viewer.setContentProvider(ArrayContentProvider.getInstance());
     
            ViewersObservables.observeCheckedElements(viewer, MyModel.class)
                .addSetChangeListener(new ISetChangeListener() {
     
                  @Override
                  public void handleSetChange(final SetChangeEvent event) {
                    for (final Object element : event.diff.getAdditions()) {
                      if (element instanceof MyModel) {
                        ((MyModel) element).setFolder(true);
                      }
                    }
                    for (final Object element : event.diff.getRemovals()) {
                      if (element instanceof MyModel) {
                        ((MyModel) element).setFolder(false);
                      }
                    }
                  }
                });
     
            viewer.setLabelProvider(new LabelProvider() {
              @Override
              public String getText(final Object element) {
                return ((MyModel) element).getName();
              }
            });
     
            viewer.setInput(models);
     
            shell.pack();
            shell.open();
            while (!shell.isDisposed()) {
              if (!display.readAndDispatch())
                display.sleep();
            }
            display.dispose();
     
          }
        });
        Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
          @Override
          public void run() {
            for (final MyModel myModel : models) {
              System.out.println("Name: " + myModel.getName() + " // folder? "
                  + myModel.isFolder());
            }
          }
        }));
      }
    }
    Voilà, à+
    Gueritarish
    Pas de questions technique par MP, les forums sont là pour ça.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2012
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    Merci Gueritarish pour ta réponse.

    En essayant d'appliquer ton code je me suis rendu compte que mes besoins étaient un peu trop compliqués (différents type de nœuds cochables, le fait de cocher un nœud entraine le cochage d'un autre nœud (ça peut être un autre type), ça entraine aussi l'édition de colonnes, etc...)), et que l'impact de la mise en place de ta solution n'est pas négligeable.

    Je suis donc resté avec mon code qui n'est peut être pas optimisé, mais qui a le mérite de faire ce que je souhaite et d'être assez clair pour qui le reprendra après.

    Merci en tout cas

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

Discussions similaires

  1. [Tableaux] pb avec les checkbox
    Par splouf dans le forum Langage
    Réponses: 29
    Dernier message: 12/01/2006, 15h52
  2. Réponses: 1
    Dernier message: 30/11/2005, 14h57
  3. Sélection automatique de tous les checkbox d'un dbgrid
    Par bertrand_declerck dans le forum Bases de données
    Réponses: 3
    Dernier message: 19/08/2005, 09h55
  4. Pb avec les checkbox: tout sélectionner,récupération valeurs
    Par bubble_gum dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 28/10/2004, 17h42

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