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 :

désactiver un TabItem


Sujet :

SWT/JFace Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 7
    Par défaut désactiver un TabItem
    Bonjour,

    J'utilise la classe org.eclipse.swt.TabFolder et TabItem pour faire des onglets.

    Je voudrais savoir s'il est possible de désactiver un seul des onglets (et qu'il soit grisé par exemple).

    Le TabFolder possède bien une méthode setEnabled mais pas TabItem. Et désactiver le TabFolder désactive forcément tous les onglets, alors que je veux en désactiver un seul.

    J'ai vu qu'il existe des classes CTabFolder et CTabItem mais j'ai l'impression que c'est la même chose à ce niveau là..

    Est-ce que quelqu'un sait s'il existe un moyen simple de faire cela ? Ou est-ce qu'il y a une astuce ?

  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 : 41
    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
    Par défaut
    Salut,

    Je ne sais pas quel est ton besoin derrière la désactivation d'un TabItem, mais si tu ne veux pas donner accès aux éléments contenus dans ton TabItem (champs texte et autres par ex...), tu peux éventuellement passer par un CTabFolder avec des CTabItem. L'utilité étant d'avoir accès à la méthode setControl du CTabItem. Le but est d'associer le Control de plus haut niveau à ton CTabItem (un Composite j'imagine, ou un ScrolledComposite). Une fois ce Control associé au CTabItem tu peux passer le Composite à enabled ou non suivant la sélection de l'utilisateur. Par exemple, tu peux mettre un Listener sur ton CTabFolder et suivant l'item sélectionné, son contenu sera actif ou non.
    Un petit exemple dans lequel les CTabItem impair ne sont pas éditables:
    Code Java : 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
        /**
         * The number of {@link CTabItem}s.
         */
        private static final int NUMBER_OF_ELEMENTS = 4;
     
        /**
         * The key to the data store in each {@link CTabItem}.
         */
        private static final String IS_ENABLED = "isEnabled";
     
        /**
         * @param args the entries of the main.
         */
        public static void main(final String[] args) {
            Display display = new Display();
            Shell shell = new Shell(display);
            shell.setLayout(new FillLayout());
            CTabFolder folder = new CTabFolder(shell, SWT.BORDER);
            CTabItem item;
            Composite folderComposite;
            Text text;
            for (int i = 0; i < NUMBER_OF_ELEMENTS; i++) {
                item = new CTabItem(folder, SWT.CLOSE);
                item.setText("Item " + i);
                folderComposite = new Composite(folder, SWT.NONE);
                folderComposite.setLayout(new FillLayout());
                text = new Text(folderComposite, SWT.MULTI);
                text.setText("Content for Item " + i);
                item.setControl(folderComposite);
                // On stocke l'état (actif ou non) du contenu
                item.setData(IS_ENABLED, i % 2 == 0);
            }
     
            folder.addListener(SWT.Selection, new Listener() {
     
                /**
                 * {@inheritDoc}
                 */
                public void handleEvent(final Event event) {
                    Widget selectedItem = event.item;
                    if (selectedItem instanceof CTabItem) {
                        // On récupère le contenu stocké
                        boolean isEnabled =
                            (Boolean) selectedItem.getData(IS_ENABLED);
                        // On met à jour l'état du Composite.
                        ((CTabItem) selectedItem).getControl()
                            .setEnabled(isEnabled);
                    }
                }
            });
     
            shell.pack();
            shell.open();
            while (!shell.isDisposed()) {
                if (!display.readAndDispatch()) {
                    display.sleep();
                }
            }
            display.dispose();
        }
    Ça peut être une piste pour toi

    Voilà, à+
    Gueritarish

  3. #3
    Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 7
    Par défaut
    Merci pour ta réponse.

    J'avais envisagé ce genre de solution.
    Mais je voudrais savoir s'il est possible de faire en sorte qu'il ne se passe rien du tout lorsqu'on clique sur un onglet "désactiver". C'est à dire que le composite associé avec setcontrol ne s'affiche pas du tout, et que l'on reste dans l'onglet déjà sélectionné.

    Mais effectivement, si ce n'est pas possible, je me tournerais vers une solution où je désactive tout les composant de l'onglet...

  4. #4
    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 : 41
    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
    Par défaut
    Un contournement consiste à écouter la sélection de l'utilisateur et à remettre cette sélection sur la sélection précédente si l'onglet ne doit pas être accessible. Un bout de code vaut mieux qu'un long discours:
    Code Java : 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
        /**
         * The number of {@link CTabItem}s.
         */
        private static final int NUMBER_OF_ELEMENTS = 4;
     
        /**
         * The key to the data store in each {@link CTabItem}.
         */
        private static final String IS_ENABLED = "isEnabled";
     
        /**
         * The previous selection of the user.
         */
        private static int previousSelection = -1;
     
        /**
         * @param args the entries of the main.
         */
        public static void main(final String[] args) {
            Display display = new Display();
            Shell shell = new Shell(display);
            shell.setLayout(new FillLayout());
            final CTabFolder folder = new CTabFolder(shell, SWT.BORDER);
            CTabItem item;
            Composite folderComposite;
            Text text;
            for (int i = 0; i < NUMBER_OF_ELEMENTS; i++) {
                item = new CTabItem(folder, SWT.CLOSE);
                item.setText("Item " + i);
                folderComposite = new Composite(folder, SWT.NONE);
                folderComposite.setLayout(new FillLayout());
                text = new Text(folderComposite, SWT.MULTI);
                text.setText("Content for Item " + i);
                item.setControl(folderComposite);
                item.setData(IS_ENABLED, i % 2 == 0);
            }
     
            folder.addSelectionListener(new SelectionAdapter() {
     
                /**
                 * {@inheritDoc}
                 */
                @Override
                public void widgetSelected(final SelectionEvent e) {
                    Widget selectedItem = e.item;
                    Widget parentWidget = e.widget;
                    if (selectedItem instanceof CTabItem
                        && parentWidget instanceof CTabFolder) {
                        boolean isEnabled =
                            (Boolean) selectedItem.getData(IS_ENABLED);
                        if (!isEnabled) {
                            // Attention au cas limite où la première sélection n'est pas permise
                            ((CTabFolder) parentWidget)
                                .setSelection(previousSelection);
                        } else {
                            previousSelection =
                                ((CTabFolder) parentWidget).getSelectionIndex();
                        }
                    }
                }
            });
     
            shell.pack();
            shell.open();
            while (!shell.isDisposed()) {
                if (!display.readAndDispatch()) {
                    display.sleep();
                }
            }
            display.dispose();
        }

    Voilà, à+
    Gueritarish

  5. #5
    Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 7
    Par défaut
    Merci encore.

    J'ai donc utilisé ce principe.

    Par contre c'est un peu dommage que la classe TabItem n'implémente pas une méthode setEnabled... Parce qu'avec la solution du listener, lorsqu'on clique sur l'onglet "désactivé", il y a un léger "clignotement" désagréable. En fait, l'onglet "désactivé" apparaît une fraction de seconde avant que le précédent revienne...

    En attendant une autres solution, il faudra que je me satisfasse de celle là...

    Encore merci, super forum, réponse rapide et clair, c'est cool.

  6. #6
    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 : 41
    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
    Par défaut
    Il y a peut-être mieux comme solution, mais j'avoue ne pas la connaître

Discussions similaires

  1. Désactiver la multi-sélection d'une grille
    Par Riko dans le forum Composants VCL
    Réponses: 6
    Dernier message: 17/06/2003, 09h47
  2. Comment désactiver Ctrl+Alt+Del sous Windows XP
    Par ETOKA dans le forum API, COM et SDKs
    Réponses: 6
    Dernier message: 04/06/2003, 13h34
  3. Désactivation de la souris
    Par mika dans le forum API, COM et SDKs
    Réponses: 6
    Dernier message: 13/03/2003, 13h15
  4. Désactiver les touches F1, F2, F3, F4, F5 dans IE
    Par ZiZouJH dans le forum Flash
    Réponses: 7
    Dernier message: 17/02/2003, 09h59
  5. Réponses: 8
    Dernier message: 17/05/2002, 09h08

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