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 :

[SWT] ScrolledComposite et classes internes


Sujet :

SWT/JFace Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    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 [SWT] ScrolledComposite et classes internes
    Bonjour tout le monde,

    Alors, j'ai parcourus le forum SWT, et je n'ai pas trouvé de discussions se rapportant à ce sujet bien précis.
    Donc, je vous explique mon problème :
    Je développe un plug-in Eclipse, et j'en suis à la création d'un Wizard. Dans ma WizardPage, j'ai donc la méthode createControl(Composite parent) pour le contenu de la page...
    Donc, dans cette méthode, j'ai associer au parent un Label et une Combo contenant des noms de Classes (pas au sens Java du terme).
    Sur cette Combo, j'ai ajouté un Listener (qui est une classe interne) qui s'occupe de l'ajout de Label et de Text correspondant aux identifiants de la Classe sélectionné. Donc, quand l'utilisateur choisit une Classe dans la Combo, je crée une nouvelle instance de Composite que je mets à jour avec un layout(true) une fois les Labels et Texts ajouté.
    Ma question est la suivante :
    J'aimerais utilisé un ScrolledComposite pour avoir des scroll bars pour permettre l'affichage des Composants en gardant une même taille de Wizard.
    Pour l'instant j'ai implémenté une méthode qui ne m'affiche rien du tout .

    Voici donc le code de ma méthode createControl(Composite parent):
    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
    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
    119
    120
    121
    122
    final Composite compositeParent = parent;
    compositeParent.setLayout(new FormLayout());
     
    final Label findLabel = new Label(compositeParent, SWT.NONE);
    FormData fd_label = new FormData();
    fd_label.left = new FormAttachment(17, 0);
    fd_label.top = new FormAttachment(0, 10);
    findLabel.setLayoutData(fd_label);
    findLabel.setText("Select a type:");
     
    final Combo classTypeCombo = new Combo(compositeParent, SWT.READ_ONLY);
    final FormData fd_combo = new FormData();
    fd_combo.left = new FormAttachment(findLabel, 15, SWT.RIGHT);
    fd_combo.top = new FormAttachment(0, 10);
    classTypeCombo.setLayoutData(fd_combo);
    classTypeCombo.setText("Choose a Class Type");
     
    //La méthode fillClassCombo permet de remplir la Combo...
    classTypeCombo.setItems(fillClassCombo());
     
    final ScrolledComposite scroll = new ScrolledComposite(compositeParent, SWT.BORDER | SWT.V_SCROLL);
    FormData fd_scroll = new FormData();
    fd_scroll.top = new FormAttachment(findLabel, 32, SWT.BOTTOM);
    scroll.setLayout(new FormLayout());
    scroll.setLayoutData(fd_scroll);
     
    composite = new Composite(scroll, SWT.NONE);
    composite.setLayout(new FormLayout());
    FormData fd_composite = new FormData();
    fd_composite.top = new FormAttachment(classTypeCombo, 0, SWT.TOP);
    composite.setLayoutData(fd_composite);
    setControl(scroll);
     
    classTypeCombo.addListener(SWT.Selection, new Listener()
    {
    	    @Override
    	    public void handleEvent(Event event)
    	    {
    	        if (classTypeCombo.getSelectionIndex() != -1)
    	        {
    	            if (composite != null && !composite.isDisposed())
    	            {
    	                composite.dispose();
    	            }
    	            composite = new Composite(scroll, SWT.NONE);
    	            composite.setLayout(new FormLayout());
    	            scroll.setContent(composite);
    	            String className = classTypeCombo.getItem(classTypeCombo.getSelectionIndex());
    	            //Méthode permettant d'obtenir les attributs grâce au nom d'une Classe
    	            List < String > attributes = getAttributesByClass(className);
    		            Label idLabel = null;
    	            if (attributes != null)
    	            {
    	                Iterator < String > itAttributes = attributes.iterator();
    	                String idLabelName = "Enter Functionnal Key values : ";
    	                idLabel = new Label(composite, SWT.NONE);
    	                FormData fd_label = new FormData(), fd_text;
    	                fd_label.top = new FormAttachment(findLabel, 32, SWT.BOTTOM);
    	                fd_label.left = new FormAttachment(0, 10);
    	                idLabel.setLayoutData(fd_label);
    	                idLabel.setText(idLabelName);
    	                Text idText;
    	                while (itAttributes.hasNext()) {
    	                    idLabelName = itAttributes.next();
    	                    fd_label = new FormData();
    	                    fd_label.top = new FormAttachment(idLabel, 20, SWT.BOTTOM);
    	                    fd_label.left = new FormAttachment(0, 20);
    	                    idLabel = new Label(composite, SWT.NONE);
    	                    idLabel.setLayoutData(fd_label);
    	                    idLabel.setText(idLabelName);
     
    	                    idText = new Text(composite, SWT.BORDER);
    	                    fd_text = new FormData();
    	                    fd_text.left = new FormAttachment(idLabel, 15, SWT.RIGHT);
    	                    fd_text.top =  new FormAttachment(idLabel, 0, SWT.TOP);
    	                    idText.setLayoutData(fd_text);
    	                    idText.setSize(100, -1);
    	                }
    	            }
    	            //Méthode permettant d'obtenir les labels grâce au nom d'une Classe.
    	            List < String > labels = getLabelsByClass(className);
    	            if (labels != null)
    	            {
    	                Iterator < String > itLabels = labels.iterator();
    	                String pkLabelName = "Enter Labels values : ";
    	                Label pkLabel = new Label(composite, SWT.NONE);
    	                FormData fd_label = new FormData(), fd_text;
    	                boolean idLabelNull = idLabel == null;
    	                fd_label.top = new FormAttachment(idLabelNull ? findLabel : idLabel,
    		                        idLabelNull ? 32 : 25, SWT.BOTTOM);
    	                fd_label.left = new FormAttachment(0, 10);
    	                pkLabel.setLayoutData(fd_label);
    	                pkLabel.setText(pkLabelName);
    	                Text pkText;
    	                while (itLabels.hasNext()) {
    	                    pkLabelName = itLabels.next();
    	                    fd_label = new FormData();
    	                    fd_label.top = new FormAttachment(pkLabel, 20, SWT.BOTTOM);
    	                    fd_label.left = new FormAttachment(0, 20);
    	                    pkLabel = new Label(composite, SWT.NONE);
    	                    pkLabel.setLayoutData(fd_label);
    	                    pkLabel.setText(pkLabelName);
     
    	                    pkText = new Text(composite, SWT.BORDER);
    	                    fd_text = new FormData();
    	                    fd_text.left = new FormAttachment(pkLabel, 15, SWT.RIGHT);
    	                    fd_text.top = new FormAttachment(pkLabel, 0, SWT.TOP);
    	                    pkText.setLayoutData(fd_text);
    	                    pkText.setSize(100, -1);
    	                }
    	            }
     
    	            scroll.setMinWidth(200);
    	            scroll.setMinHeight(200);
    	            scroll.setExpandVertical(true);
    	            scroll.setContent(composite);
    	            composite.layout(true);
    	            compositeParent.layout(true);
    	            compositeParent.update();
    	        }
    	    }
    	});
    Donc, il y a surement quelque chose que je fais mal, puisqu'en fait, avant l'ajout du ScrolledComposite, l'insertion de Composant dynamiquement ce faisait très bien...

    Donc, si quelqu'un a la patience de regarder mon code pour voir ce qui cloche merci d'avance...

    Voilà, ++
    Gueritarish

    PS : le code paraît long, mais en fait ce sont les layouts qui prennent le plus de place

  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
    Essaie en spécifiant setExpandVertical() et setExpandHorizontal() à true.
    Sinon je vois que tu ajoutes deux fois ton Composite à ton ScrolledComposite, ce qui n'est pas nécessaire.

  3. #3
    Membre expérimenté

    Profil pro
    Inscrit en
    Août 2006
    Messages
    218
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Août 2006
    Messages : 218
    Par défaut
    Bonjour,

    Après quelques tâtonnements, voici ma solution :
    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
    119
    120
    121
    122
    123
     
            final Composite compositeParent = parent;
            compositeParent.setLayout(new FormLayout());
     
            final Label findLabel = new Label(compositeParent, SWT.NONE);
            FormData fd_label = new FormData();
            fd_label.left = new FormAttachment(17, 0);
            fd_label.top = new FormAttachment(0, 10);
            findLabel.setLayoutData(fd_label);
            findLabel.setText("Select a type:");
     
            final Combo classTypeCombo = new Combo(compositeParent, SWT.READ_ONLY);
            final FormData fd_combo = new FormData();
            fd_combo.left = new FormAttachment(findLabel, 15, SWT.RIGHT);
            fd_combo.top = new FormAttachment(0, 10);
            classTypeCombo.setLayoutData(fd_combo);
            classTypeCombo.setText("Choose a Class Type");
     
            // La méthode fillClassCombo permet de remplir la Combo...
            classTypeCombo.setItems(fillClassCombo());
     
            final ScrolledComposite scroll = new ScrolledComposite(compositeParent, SWT.BORDER | SWT.V_SCROLL);
            FormData fd_scroll = new FormData();
            fd_scroll.top = new FormAttachment(findLabel, 32, SWT.BOTTOM);
            // Spécification de la taille du SC
            fd_scroll.width = 200;
            fd_scroll.height = 200;
            scroll.setLayoutData(fd_scroll);
     
            // Astuce, il faut mettre les deux à true (!)
            scroll.setExpandHorizontal(true);
            scroll.setExpandVertical(true);
     
            composite = new Composite(scroll, SWT.NONE);
            composite.setLayout(new FormLayout());
            FormData fd_composite = new FormData();
            fd_composite.top = new FormAttachment(classTypeCombo, 0, SWT.TOP);
            composite.setLayoutData(fd_composite);
            setControl(scroll);
     
            scroll.setContent(composite);
            scroll.setMinHeight(200);
     
            classTypeCombo.addListener(SWT.Selection, new Listener() {
                public void handleEvent(Event event) {
                    if (classTypeCombo.getSelectionIndex() == -1) {
                        return;
                    }
                    // Destruction des éléments
                    if (composite != null && !composite.isDisposed()) {
                        for (Control current : composite.getChildren()) {
                            current.dispose();
                        }
                    }
     
                    String className = classTypeCombo.getItem(classTypeCombo.getSelectionIndex());
                    // Méthode permettant d'obtenir les attributs grâce au nom d'une Classe
                    List<String> attributes = getAttributesByClass(className);
                    Label idLabel = null;
                    if (attributes != null) {
                        Iterator<String> itAttributes = attributes.iterator();
                        String idLabelName = "Enter Functionnal Key values : ";
                        idLabel = new Label(composite, SWT.NONE);
                        FormData fd_label = new FormData(), fd_text;
                        fd_label.top = new FormAttachment(findLabel, 32, SWT.BOTTOM);
                        fd_label.left = new FormAttachment(0, 10);
                        idLabel.setLayoutData(fd_label);
                        idLabel.setText(idLabelName);
                        Text idText;
                        while (itAttributes.hasNext()) {
                            idLabelName = itAttributes.next();
                            fd_label = new FormData();
                            fd_label.top = new FormAttachment(idLabel, 20, SWT.BOTTOM);
                            fd_label.left = new FormAttachment(0, 20);
                            idLabel = new Label(composite, SWT.NONE);
                            idLabel.setLayoutData(fd_label);
                            idLabel.setText(idLabelName);
     
                            idText = new Text(composite, SWT.BORDER);
                            fd_text = new FormData();
                            fd_text.left = new FormAttachment(idLabel, 15, SWT.RIGHT);
                            fd_text.top = new FormAttachment(idLabel, 0, SWT.TOP);
                            idText.setLayoutData(fd_text);
                            idText.setSize(100, -1);
                        }
                    }
                    // Méthode permettant d'obtenir les labels grâce au nom d'une Classe.
                    List<String> labels = getLabelsByClass(className);
                    if (labels != null) {
                        Iterator<String> itLabels = labels.iterator();
                        String pkLabelName = "Enter Labels values : ";
                        Label pkLabel = new Label(composite, SWT.NONE);
                        FormData fd_label = new FormData(), fd_text;
                        boolean idLabelNull = idLabel == null;
                        fd_label.top = new FormAttachment(idLabelNull ? findLabel : idLabel, idLabelNull ? 32 : 25, SWT.BOTTOM);
                        fd_label.left = new FormAttachment(0, 10);
                        pkLabel.setLayoutData(fd_label);
                        pkLabel.setText(pkLabelName);
                        Text pkText;
                        while (itLabels.hasNext()) {
                            pkLabelName = itLabels.next();
                            fd_label = new FormData();
                            fd_label.top = new FormAttachment(pkLabel, 20, SWT.BOTTOM);
                            fd_label.left = new FormAttachment(0, 20);
                            pkLabel = new Label(composite, SWT.NONE);
                            pkLabel.setLayoutData(fd_label);
                            pkLabel.setText(pkLabelName);
     
                            pkText = new Text(composite, SWT.BORDER);
                            fd_text = new FormData();
                            fd_text.left = new FormAttachment(pkLabel, 15, SWT.RIGHT);
                            fd_text.top = new FormAttachment(pkLabel, 0, SWT.TOP);
                            pkText.setLayoutData(fd_text);
                            pkText.setSize(100, -1);
                        }
                    }
     
                    // On retaille l'ensemble
                    composite.layout();
                    scroll.setMinHeight(composite.computeSize(SWT.DEFAULT, SWT.DEFAULT).y);
     
                }
            });
    J'espère t'avoir aidé,

    Laurent

  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
    C'est génial, c'est exactement la solution...
    Merci infiniment...
    Ce qui me frustre un peu c'est d'avoir été aussi prêt mais de pas avoir trouvé
    Parce qu'en gros, dans ta solution, tu rajoutes les setExpandXXX à true et la destruction des éléments du Composite plutôt que la création d'un nouvel objet à chaque mise à jour. J'ai bon? Ou tu as fais d'autres choses?

    En tout cas, encore une fois, merci

  5. #5
    Membre expérimenté

    Profil pro
    Inscrit en
    Août 2006
    Messages
    218
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Août 2006
    Messages : 218
    Par défaut
    Citation Envoyé par Gueritarish Voir le message
    Parce qu'en gros, dans ta solution, tu rajoutes les setExpandXXX à true et la destruction des éléments du Composite plutôt que la création d'un nouvel objet à chaque mise à jour. J'ai bon? Ou tu as fais d'autres choses?
    J'ai aussi spécifié une taille pour le scrolledComposite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    // Spécification de la taille du SC
    fd_scroll.width = 200;
    fd_scroll.height = 200;
    Et surtout à la fin :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    // On retaille l'ensemble
    composite.layout();
    scroll.setMinHeight(composite.computeSize(SWT.DEFAULT, SWT.DEFAULT).y);
    Content de t'avoir aidé,

    A+

    Laurent

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

Discussions similaires

  1. [Timer] Classes internes et actionEvent
    Par smag dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 04/07/2005, 06h51
  2. Heritage de classe avec classes internes
    Par Regis.C dans le forum Langage
    Réponses: 11
    Dernier message: 27/04/2005, 12h19
  3. [heritage] etendre une classe interne en dehors du package
    Par ChristopheH dans le forum Langage
    Réponses: 2
    Dernier message: 11/10/2004, 14h15
  4. [Débutant][Conception] Erreur avec une classe interne
    Par Devil Redneck dans le forum Général Java
    Réponses: 5
    Dernier message: 11/06/2004, 15h45
  5. [Thread] Erreur dans une classe interne
    Par totof2308 dans le forum Général Java
    Réponses: 5
    Dernier message: 03/06/2004, 08h15

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