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

Eclipse Platform Discussion :

[RAP] Formulaire avec 2-3 champs ne s'affiche pas


Sujet :

Eclipse Platform

  1. #1
    Membre actif
    Profil pro
    100
    Inscrit en
    Juillet 2007
    Messages
    585
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : 100

    Informations forums :
    Inscription : Juillet 2007
    Messages : 585
    Points : 270
    Points
    270
    Par défaut [RAP] Formulaire avec 2-3 champs ne s'affiche pas
    Bonjour,

    Je suis en train de suivre un livre pour apprendre le développement d'application RAP et je rencontre un problème d'affichage d'un formulaire, celui-ci ne s'affiche tout simplement pas...

    J'ai une classe "CatEditor" qui est appelée lorsque je double-clique sur une ligne d'une table qui elle s'affiche bien (depuis la classe qui représente ma vue "CatShelterView").
    La classe "CatEditor" construit un simple formulaire et normalement devrait l'afficher à l'écran mais ce n'est pas le cas.
    En debug je passe bien dans la méthode qui construit le formulaire mais c'est comme si je pointais sur le mauvais parent (je ne maitrise pas encore très bien, et de loin, la notion de parent, composite, shell ....)

    Voici les 2 classes en question :

    CatShelteView
    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
    public class CatShelterView extends ViewPart {
     
        public static final String ID = "catshelter.view";
        private TableViewer viewer;
     
        public CatShelterView() {
     
        }
     
        public TableViewer getViewer() {
            return viewer;
        }
     
        @Override
        public void createPartControl(Composite parent) {
            parent.setLayout(new FillLayout(SWT.VERTICAL));
     
            Label helloWorld = new Label(parent, SWT.HORIZONTAL);
            helloWorld.setText("Those cats need new can opener");
     
            viewer = new TableViewer(parent);
            CatLabelProvider labels = new CatLabelProvider();
            labels.createColumns(viewer);
            viewer.setLabelProvider(labels);
            viewer.setContentProvider(new CatsProvider());
     
            viewer.setInput(getSite());
     
            getSite().setSelectionProvider(viewer);
            addEditor(viewer);
        }
     
        private void addEditor(StructuredViewer viewer) {
            viewer.addDoubleClickListener(new IDoubleClickListener() {
                @Override
                public void doubleClick(DoubleClickEvent event) {
                    ISelection selection = getViewer().getSelection();
                    if (selection instanceof IStructuredSelection) {
                        List selectionList = ((IStructuredSelection) selection).toList();
                        for (Object selectedObject : selectionList) {
                            if (selectedObject instanceof Cat) {
                                CatEditorInput input = new CatEditorInput((Cat) selectedObject);
                                try {
                                    getSite().getPage().openEditor(input, CatEditor.ID);
                                } catch (PartInitException e) {
                                    throw new RuntimeException(CatEditor.ID + " not found");
                                }
                            }
                        }
                    }
                }
            });
        }
     
        @Override
        public void setFocus() {
     
        }
     
    }
    Et la classe CatEditor
    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
    public class CatEditor extends EditorPart {
     
        public static final String ID = "catshelter.editor";
        private Cat cat;
     
        private static final GridData FILL = new GridData(GridData.FILL_HORIZONTAL);
     
        private Button male;
        private Button female;
        private Text name;
        private Text likes;
        private Button save;
     
        public CatEditor() {
            super();
        }
     
        @Override
        public void doSave(IProgressMonitor monitor) {
     
        }
     
        @Override
        public void doSaveAs() {
     
        }
     
        @Override
        public void init(IEditorSite site, IEditorInput input)
                throws PartInitException {
            if (!(input instanceof CatEditorInput)) {
                throw new RuntimeException("Input not of type " + CatEditorInput.class.getName());
            }
     
            setSite(site);
            setInput(input);
            setPartName(input.getName());
            cat = (Cat) input.getAdapter(Cat.class);
        }
     
        @Override
        public boolean isDirty() {
            return false;
        }
     
        @Override
        public boolean isSaveAsAllowed() {
            return false;
        }
     
        @Override
        public void createPartControl(Composite parent) {
            FormToolkit tk = new FormToolkit(parent.getDisplay());
            Composite body = tk.createForm(parent).getBody();
            body.setLayoutData(new GridLayout(2, true));
     
            tk.createLabel(body, "Name:");
            name = new Text(body, SWT.BORDER);
            name.setLayoutData(FILL);
     
            tk.createLabel(body, "Likes:");
            likes = new Text(body, SWT.BORDER);
            likes.setLayoutData(FILL);
     
            tk.createLabel(body, "Gender:");
            Composite group = tk.createComposite(body);
            group.setLayout(new FillLayout(SWT.VERTICAL));
            male = tk.createButton(group, "Male", SWT.RADIO);
            female = tk.createButton(group, "Female", SWT.RADIO);
     
            setValuesToFields(cat);
     
            save = tk.createButton(group, "Save", SWT.PUSH);
            save.addSelectionListener(new SelectionListener() {
                @Override
                public void widgetSelected(SelectionEvent e) {
                    saveValuesToModel(cat);
     
                    IWorkbenchPage page = getSite().getPage();
                    IViewPart view = page.findView(CatShelterView.ID);
                    if (view instanceof CatShelterView) {
                        ((CatShelterView) view).getViewer().refresh();
                    }
                }
     
                @Override
                public void widgetDefaultSelected(SelectionEvent e) {
     
                }
            });
        }
     
        private void setValuesToFields(Cat cat) {
            name.setText(cat.getName());
            likes.setText(cat.getLikes());
            switch(cat.getGender()) {
                case male : this.male.setSelection(true);
                    break;
                case female : this.female.setSelection(true);
                    break;
            }
        }
     
        private void saveValuesToModel(Cat cat) {
            cat.setName(name.getText());
            cat.setLikes(likes.getText());
            if (male.getSelection()) {
                cat.setGender(Gender.male);
            } else if (female.getSelection()) {
                cat.setGender(Gender.female);
            }
        }
     
        @Override
        public void setFocus() {
     
        }
     
    }
    Et si jamais en fichier zip mon projet qui contient toutes les classes
    catshelter.zip

    D'avance un grand merci pour votre aide

  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 : 54
    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,

    Quand tu dis que l'éditeur ne s'affiche pas, tu veux dire qu'il s'ouvre, mais s'affiche avec juste un carré blanc, c'est bien ça ?

    Il y a une erreur dans la ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    body.setLayoutData(new GridLayout(2, true));
    C'est setLayout qu'il faut appeler ici.

    Par ailleurs, tu devrais créer tes composants Text avec la méthode de FormToolkit, pour une intégration complète du composant au formulaire.

    Autre conseil, que j'applique moi-même et qui évite parfois des dysfonctionnements dans l'affichage : je créé toujours un composite intermédiaire dans les méthode createPartControl, et je ne touche pas au layout du composant passé en argument (c'est un réflexe que j'applique aux éditeurs, vues et dialogues) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    @Override
    public void createPartControl(Composite parent) {
     
         Composite composite = new Composite(parent, SWT.NONE);
         composite.setLayout(...);
     
     
         comp = new ...(composite, ...); // j'utilise composite comme parent de tous mes composants
     
         // je ne touche pas au layout du composant passé en argument (je laisse le composant qui a créé ce parent gérer ça)
     
    }

    Enfin, tu devrais jeter un coup d'œil aux helpers de JFace, GridLayoutFactory et GridDataFactory, qui devraient te simplifier le travail de layout et normalement t'éviter ce genre de bévue.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre actif
    Profil pro
    100
    Inscrit en
    Juillet 2007
    Messages
    585
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : 100

    Informations forums :
    Inscription : Juillet 2007
    Messages : 585
    Points : 270
    Points
    270
    Par défaut
    Hello,

    Quand tu dis que l'éditeur ne s'affiche pas, tu veux dire qu'il s'ouvre, mais s'affiche avec juste un carré blanc, c'est bien ça ?
    Oui c'est effectivement ça, il s'affiche mais vide.

    Il y a une erreur dans la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    body.setLayoutData(new GridLayout(2, true));
    C'est setLayout qu'il faut appeler ici.
    Effectivement, en changeant cela ça fonctionne, le formulaire s'affiche bien.

    Par ailleurs, tu devrais créer tes composants Text avec la méthode de FormToolkit, pour une intégration complète du composant au formulaire.
    C'est ce que je fais, en tout cas dans CatEditor, à moins que tu parles d'une autre manière ?

    Autre conseil, que j'applique moi-même et qui évite parfois des dysfonctionnements dans l'affichage : je créé toujours un composite intermédiaire dans les méthode createPartControl, et je ne touche pas au layout du composant passé en argument (c'est un réflexe que j'applique aux éditeurs, vues et dialogues) :
    Ha oui effectivement, ça évitera de modifier un composite qui serait déjà utilisé pour afficher des composants et du coup qui pourrait se comporter bizarrement, c'est bien ça ?

    Enfin, tu devrais jeter un coup d'œil aux helpers de JFace, GridLayoutFactory et GridDataFactory, qui devraient te simplifier le travail de layout et normalement t'éviter ce genre de bévue.
    Je vais y jetter un œil, ca m'aidera certainement.

    Un grand merci pour tes conseils et remarques.

  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 : 54
    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
    Citation Envoyé par doons Voir le message
    C'est ce que je fais, en tout cas dans CatEditor, à moins que tu parles d'une autre manière ?
    Tu crées les Text par new, au lieu d'utiliser createText() de FormToolkit.


    Citation Envoyé par doons Voir le message
    Ha oui effectivement, ca evitera de modifier un composite qui serait déjà utilisé pour afficher des composants et du coup qui pourrait se comporter bizarrement, c'est bien ça ?
    Oui, ça et de modifier le comportement d'un composant qu'on ne crée pas. Accessoirement, ça permet d'être plus modulaire, en ajoutant une méthode protected intermédiaire pour créer ce composite, on peut ensuite étendre la classe pour intercaler d'autres composants.
    [/QUOTE]
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre actif
    Profil pro
    100
    Inscrit en
    Juillet 2007
    Messages
    585
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : 100

    Informations forums :
    Inscription : Juillet 2007
    Messages : 585
    Points : 270
    Points
    270
    Par défaut
    Extra, merci beaucoup pour ces nouvelles précisions.
    Je vais continuer mon apprentissage :-)

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 22/10/2008, 16h44
  2. ouverture formulaire avec affectation de champ
    Par david87 dans le forum IHM
    Réponses: 6
    Dernier message: 30/04/2008, 16h21
  3. Formulaire avec nombre de champ variable
    Par david87 dans le forum IHM
    Réponses: 0
    Dernier message: 21/04/2008, 10h16
  4. Formulaire avec nombre de champs dynamique
    Par kodo dans le forum Struts 1
    Réponses: 1
    Dernier message: 21/01/2008, 10h07
  5. [MySQL] Formulaire avec vérification des champs
    Par iwanow dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 26/01/2007, 18h38

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