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 :

Premier TabItem vide dans un TabFolder


Sujet :

SWT/JFace Java

  1. #1
    Membre éclairé Avatar de Julien Bodin
    Homme Profil pro
    Devops
    Inscrit en
    Février 2009
    Messages
    474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Devops
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 474
    Par défaut Premier TabItem vide dans un TabFolder
    Bonsoir à tous !

    Je me retrouve devant un phénomène que j'ai beaucoup de mal à expliquer. Pour les besoins de mon application j'ai besoin qu'un utilisateur puisse ajouter dynamiquement des onglets (des TabItems à un TabFolder).

    Pour celà j'ai créé une fonction qui créé un TabItem, le remplit avec les composants que je souhaite afficher à l'intérieur et le lie au TabFolder.

    Et ça fonctionne assez bien... ou presque. Lorsque j'ajoute le premier onglet celui-ci apparait complètement vide. En revanche les suivants apparaissent normalement et fonctionnent comme prévu.

    Pour préciser un peu le contexte, il s'agit d'un éditeur de niveau 2D qui fonctionne en posant des "morceaux graphiques" (des images de 16x16 pixels). Pour ceux qui connaissent un peu il s'agit d'un simple éditeur de tuiles (ou tile editor).
    Lors du démarrage de l'application l'utilisateur choisit de créer un nouveau niveau ou d'un ouvrir un. S'il souhaite créer un nouveau niveau je créé immédiatement un premier sous-niveau.
    Ma classe Niveau n'est en fait qu'une classe gérant une collection de sous-niveaux, et donc un niveau contient obligatoirement au moins un sous-niveau.

    Lorsque l'utilisateur souhaite créer un sous-niveau supplémentaire (lié à un autre sous-niveau par un système de portail) il dispose d'un menu spécifique permettant d'ajouter le sous-niveau dans un nouvel onglet.

    Voici le code qui gère la création d'un niveau (d'une map) à partir d'un menu (MenuItem). Ce code correspond donc à la création du premier onglet :

    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
    miNewMap = new MenuItem(menu1, SWT.PUSH);
    miNewMap.setText("Create a new map");
    miNewMap.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent evt) {
    	//Si nous avons déjà créé une map...
    	if(map != null){
    		//TODO Already existing map
    	}
    	//Sinon, on en créé une nouvelle directement
    	else{
    		map = new Map();
    		miMap.setEnabled(true);
    	}
     
    	//Boite de dialogue pour spécifier la taille (hauteur, largeur)
    	DlgParamNewMap paramMap = new DlgParamNewMap(shell, SWT.NULL);
     
    	Integer[] size = new Integer[2];
    	size = paramMap.open();
     
    	//Création d'un sous-niveau et d'un TabItem
    	createSubTabItem(tabFolder1, SWT.NONE, map.createSubMap(size[1], size[0]), "0");
            }
    });
    Et voici le code permettant d'ajouter d'autres sous-niveaux à partir d'un menu, ce code correspond donc à l'ajout des autres onglets (qui fonctionnent) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    btAddNewSubMap = new MenuItem(menu2, SWT.PUSH);
    btAddNewSubMap.setText("Add a sub map");
    btAddNewSubMap.addSelectionListener(new SelectionAdapter() {
    	public void widgetSelected(SelectionEvent evt) {
    		DlgParamNewMap paramMap = new DlgParamNewMap(shell, SWT.NULL);
     
    		Integer[] size = new Integer[2];
    		size = paramMap.open();
    		createSubTabItem(tabFolder1, SWT.NONE, map.createSubMap(size[0], size[1]), String.valueOf(map.getSubMaps().size()-1));
    	}
    });
    La fonction map.createSubMap ajoute un nouveau sous-niveau dans une collection avec les dimensions précisées et retourne la référence vers l'objet créé.


    Qu'est-ce qui pourrait expliquer cette différence de comportement pour deux codes quasiment identiques ?
    Aurai-je réussi à démontrer que le Java, c'est magique ?

    Je vous remercie d'avance pour votre aide

  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
    Bonjour,
    Il faut peut-être voir du côté de ta fonction createSubTabItem().
    A quoi sert le dernier attribut passé à cette fonction ?
    Es-tu sûr qu'un objet est retourné au premier appel de la fonction createSubMap() ?

  3. #3
    Membre éclairé Avatar de Julien Bodin
    Homme Profil pro
    Devops
    Inscrit en
    Février 2009
    Messages
    474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Devops
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 474
    Par défaut
    Le dernier attribut est simplement le texte qui apparaitra sur l'onglet. J'ai mis "0" pour le premier, les autres c'est taille_collection-1.

    Ma fonction createSubTabItem renvoie un TabItem mais c'est inutile puisque lors de l'instanciation de celui-ci on spécifie le parent et c'est à ce moment là que le TabItem est lié au TabFolder.

    Le TabItem est correctement créé lors de ce premier appel (vérifié au debugger) et de toutes façons ce premier onglet apparait dans le TabFolder ce qui prouve qu'il existe bel et bien... sauf qu'il est vide.

    C'est quand même étrange.

  4. #4
    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

    Citation Envoyé par desert
    Es-tu sûr qu'un objet est retourné au premier appel de la fonction createSubMap() ?
    Si ton 1er TabItem n'affiche rien, c'est qu'il ne reçoit peut-être rien (ou pas ce qu'il souhaiterait) étant donné que l'ajout de contenu se passe bien pour les suivants.
    Cela n'a peut-être rien à voir mais je viens de remarquer que le passage de valeurs à la createSubMap() est différent dans les 2 cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    map.createSubMap(size[1], size[0])
    map.createSubMap(size[0], size[1])

  5. #5
    Membre éclairé Avatar de Julien Bodin
    Homme Profil pro
    Devops
    Inscrit en
    Février 2009
    Messages
    474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Devops
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 474
    Par défaut
    Citation Envoyé par desert Voir le message
    Cela n'a peut-être rien à voir mais je viens de remarquer que le passage de valeurs à la createSubMap() est différent dans les 2 cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    map.createSubMap(size[1], size[0])
    map.createSubMap(size[0], size[1])
    En effet, je ne l'avais pas remarqué ça m'aurait posé quelques soucis par la suite.

    Mais je viens de progresser le problème. En voulant poster un screenshot de l'interface pour avoir une vue globale de celle-ci j'ai voulu l'arranger un peu pour pas trop passer pour un bourrin. En voulant agrandir la taille de certains composants j'ai fait un peu de ménage dans le code généré par Jigloo et j'ai changé le Layout de mon conteneur principal et là l'affichage est correct

    Sauf que cette fois-ci ce sont les onglets suivants qui posent un peu problème.
    Je joint deux screenshot pour les deux onglets. Le premier fonctionne bien, le second en revanche on s'aperçoit que le TabFolder de droite se positionne un peu comme il veut.

    Le layout du conteneur "global" est un FillLayout.

    J'utilise peut-être mal ce layout. En réalité je l'ai juste instancié dans le conteneur et j'ai créé les deux enfants directs sans autre précaution.

    Voici le code pour le conteneur (Composite) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    //First global composite
    Composite cmpSubMap = new Composite(parent, SWT.NONE);
    FillLayout cmpsubmapLayout = new FillLayout();
    cmpSubMap.setLayout(cmpsubmapLayout);
    tb.setControl(cmpSubMap); //TabFolder "Global"
    Le code pour le goupe de gauche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Group groupSubMap = new Group(cmpSubMap, SWT.NONE);
    groupSubMap.setSize(270, 350);
    groupSubMap.setText("Map");
    Le code pour le TabFolder de droite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    TabFolder tfTiles = new TabFolder(cmpSubMap, SWT.NONE);
    Rectangle rec = new Rectangle(270, 0, 180, 350);
    tfTiles.setBounds(rec);
    Si je ne spécifie pas les côtés du TbFolder il s'affiche derrière le Group.
    Images attachées Images attachées   

  6. #6
    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
    Personnellement, j'utiliserais plutôt un GridLayout couplé avec des GridData pour gérer les positionnements. C'est un peu moins casse-tête que de redéfinir la position et la taille des composants manuellement.
    Par contre, dans ton 1er exemple, un TabFolder ne possède pas de méthode setControl.
    Un exemple d'utilisation d'un GridLayout :
    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
    TabFolder tabFolder = new TabFolder(shell, SWT.TOP);
    TabItem tabItem1 = new TabItem(tabFolder, SWT.NULL);
    tabItem1.setText("0");
     
    Composite cmpSubMap = new Composite(tabFolder, SWT.NONE);
    /* pour créer un conteneur à 2 colonnes non égales en largeur */
    cmpSubMap.setLayout(new GridLayout(2, false)); 
    tabItem1.setControl(cmpSubMap);
     
    Group groupSubMap = new Group(cmpSubMap, SWT.NONE);
    /* Pour que le Group prenne le plus de place possible verticalement et horizontalement dans la 1ère colonne */
    groupSubMap.setLayoutData(new GridData(GridData.FILL_BOTH)); 
    groupSubMap.setText("Map");
     
    TabFolder tfTiles = new TabFolder(cmpSubMap, SWT.NONE);
    /* Pour que le TabFolder enfant prenne la place disponible verticalement dans la 2ème colonne */
    tfTiles.setLayoutData(new GridData(GridData.FILL_VERTICAL));
    TabItem tiStatics = new TabItem(tfTiles, SWT.NULL);
    tiStatics.setText("Statics ");

  7. #7
    Membre chevronné
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2007
    Messages
    340
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2007
    Messages : 340
    Par défaut
    Je suis d'accord avec desert, ton problème vient du positionnement de tes widgets (tu le fais à moitié "à la main" et à moitié via l'utilisation de Layout), suis son conseil et utilise des GridLayout pour positionner tout tes widgets. Dis-nous ensuite si le problème persiste.

  8. #8
    Membre éclairé Avatar de Julien Bodin
    Homme Profil pro
    Devops
    Inscrit en
    Février 2009
    Messages
    474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Devops
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 474
    Par défaut
    Bon, j'ai finalement trouvé la solution et j'ai franchement honte de le dire...
    Déjà, je suis passé au GridLayout et les autres onglets se sont affichés correctement mais le premier onglet restait désespérement vide.

    En voulant vous faire une capture d'écran j'ai "malencontreusement" saisi un côté de ma fenêtre et l'ai redimensionné (au lieu de la déplacer comme je le voulais) et là tous les composants sont apparus dès le premier rafraichissement.

    En fait, il manquait un cmpSubMap.layout(); à la fin de mon code

    En tous cas merci beaucoup pour votre patience et votre aide. J'ai pu apprendre à mieux maitriser le GridLayout qui est en effet très efficace et assez simple à mettre en place

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

Discussions similaires

  1. premier champ vide dans une dropdown list
    Par mvc_dev dans le forum Développement Web avec .NET
    Réponses: 2
    Dernier message: 01/04/2011, 14h21
  2. [ZF 1.10] Afficher le premier champ vide dans une liste déroulante
    Par king_soft dans le forum Zend Framework
    Réponses: 4
    Dernier message: 20/01/2011, 17h40
  3. [XL-2007] recherche cellule et mettre info dans la premiere cellule vide
    Par croky23 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 21/04/2009, 14h24
  4. mettre la premiere ligne vide dans combobox
    Par oscar.cesar dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 27/02/2008, 14h24
  5. Copy premiere Cellule vide dans colonne
    Par dvguy dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 06/12/2006, 17h32

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