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 :
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
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"); } });
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éé.
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)); } });
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![]()
Partager