Bonjour,
Je suis toujours dans mon projet de logiciel incluant un composant custom de ligne de temps, telle qu'on m'avait aidé dans le post suivant: https://www.developpez.net/forums/d1...m-ligne-temps/
Suite à un problème de référence de mes coordonnées lors de l'ajout des bulles d'informations à la ligne, je me suis aperçu qu'à chaque redessin de la Region mère, les bulles sont ajouté à nouveau dans la liste des childs de la Region mère de mon composant custom. Le phénomène se produit lorsque je fait passer ma fenêtre en plein écran, les bulles anciennes sont toujours là, mais viennent se dédoubler les régions de bulles sans leurs artifices. Donc, selon ce que je comprends, c'est que chaque fois que je redimensionne ma fenêtre, des bulles (Region) sont ajoutées en childs et font grossir incessamment la liste.
Voici un petit aperçu du résultat suite a un redimensionnement en plein écran:
Et voici quelques extraits de code que je trouve pertinent de vous montrer:
Bouye m'avait inclus ce code lorsque qu'il m'a lancé dans mon projet, j'ai suivis l'exemple pour les autres objets Path et Text:
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 //Cette fonction, est appelé dans l'@Override de layoutChildren(), notez que l'on se trouve dans une classe dérivée de Region private void layoutChildrenInArea(final double areaX, final double areaY, final double areaW, final double areaH) { // this.getChildren().clear(); axisX = clamp(areaX); // Coordonnée X de début de la règle axisY = clamp(areaY + areaH-60); // Coordonnée Y de début de la règle axisW = clamp(areaW); // largeur de la règle axisH = clamp(axisMonths.getPrefHeight()); // hauteur de la règle System.out.println("axisX: " + axisX + " axisY: " + axisY + " axisW: " + axisW + " axisH: " + axisH); //layoutInArea(axis, axisX, axisY, axisW, axisH, 0, HPos.LEFT, VPos.TOP); layoutInArea(axisWeeks, axisX, axisY, axisW, axisH-15, 0, HPos.LEFT, VPos.TOP); layoutInArea(axisMonths, axisX, axisY+10, axisW, axisH, 0, HPos.LEFT, VPos.TOP); layoutInArea(axisYears, axisX, axisY+35, axisW, axisH, 0, HPos.LEFT, VPos.TOP); //Ici, le axisWeeksMonthsYears ne semble pas se multiplier à outrance, ce que je trouve étrange... ... //Cet appel de fonction génère les bulles d'informations à partir evenement contenu dans une liste this.placeEvenements();
Est-ce que je devrais utiliser le même genre de Procédé pour clearer les Regions de mes bulles d'infos? Si oui, comment devrais-je faire?
Et voici la fonction placeEvenement où le problème se produit en réalité plutot au niveau de dessineBulle:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 private final ChangeListener timelineChangeListener = (observable, oldValue, newValue) -> { //ticks.getElements().clear(); ticksWeeks.getElements().clear(); ticksMonths.getElements().clear(); ticksYears.getElements().clear(); tickLabels.getChildren().clear(); tickYearsLabels.getChildren().clear(); labelsPane.getChildren().clear(); //this.getChildren().clear(); requestLayout(); };
À la demande, je pourrais joindre un zip de mon projet complet à cette discussion.
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
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157 private void placeEvenements() { for(FXEvenement event : listeEvenement) { dessineBulle(event); } } private void dessineBulle(FXEvenement event) { String ID = Integer.toString(event.getNewID()); Region cadre = new Region(); cadre.setId("cadre" + ID); cadre.getStyleClass().add("cadre"); Region cadreTitre = new Region(); cadreTitre.setId("cadreTitre" + ID); cadreTitre.getStyleClass().add("cadreTitre"); Region cadreNom = new Region(); cadreNom.setId("cadreNom" + ID); cadreNom.getStyleClass().add("cadreNom"); Pane titre = new Pane(); titre.setId("titre" + ID); titre.getStyleClass().add("titre"); getChildren().addAll(cadre, cadreTitre, cadreNom, titre); /* Region cadre */ /* Calculer le X du point sur la règle à partir de la dateDebut */ LocalDate dateDebut = (LocalDate) event.getDate(); LocalDate dateDebutRegle = getStartDate(); long sinceNbJour = ChronoUnit.DAYS.between(dateDebutRegle, dateDebut); System.out.println(sinceNbJour); double cadrePointX = clamp(axisX + sinceNbJour * 2.5 - cadre.getPrefWidth()/2); double cadrePointY = clamp(axisY - 50 - cadre.getPrefHeight()); /* Décider de la hauteur de la bulle par rapport à la ligne pour éviter les chevauchements sur les autres bulles*/ if(hEtageBulles >= 3) { cadrePointY = clamp(axisY - 50 - cadre.getPrefHeight()); hEtageBulles = 1; } else { int nbRegion = getChildren().size(); for(int i=0; i<nbRegion; i++) { Node leNode = getChildren().get(i); System.out.println("######## " + leNode.getStyleClass() + " ########" ); if(leNode.getStyleClass().toString().equals("cadre")) { Bounds lesCoord = leNode.getBoundsInParent(); System.out.println("------- lesCoord.getMaxX() = " + lesCoord.getMaxX() + " | cadrePointX = " + cadrePointX ); if(lesCoord.getMaxX() > cadrePointX) { /* Si on a déja trois étages de bulles derrière soi */ cadrePointY = clamp(cadrePointY - 15 - cadre.getPrefHeight()); hEtageBulles++; } } } } System.out.println("*** " + cadre.getId() + " - cadrePointX: " + cadrePointX + " | cadrePointY: " + cadrePointY); /* Boite de la bulle d'événement */ layoutInArea(cadre, cadrePointX, cadrePointY, cadre.getPrefWidth(), cadre.getPrefHeight(), 0, HPos.LEFT, VPos.TOP); /* Region titre */ layoutInArea(cadreTitre, cadrePointX, cadrePointY, cadreTitre.getPrefWidth(), cadreTitre.getPrefHeight(), 0, HPos.LEFT, VPos.TOP); /* Region du nom de la femelle */ layoutInArea(cadreNom, cadrePointX, cadrePointY+23, cadreTitre.getPrefWidth(), cadreTitre.getPrefHeight(), 0, HPos.LEFT, VPos.TOP); /* Label Titre */ final Text textTitre = new Text(event.getTitre()); textTitre.setId("titreLabel" + textTitre.getText() + ID); textTitre.getStyleClass().add("labelsPane"); textTitre.setTextOrigin(VPos.TOP); labelsPane.getChildren().add(textTitre); labelsPane.toFront(); applyCss(); System.out.println("textTitre: " + textTitre.toString()); double labelX = clamp(cadrePointX - textTitre.getBoundsInLocal().getWidth() / 2d + 100); double labelY = clamp(cadrePointY + 4); System.out.println("labelX: " + labelX + " labelY: " + labelY); textTitre.setLayoutX(labelX); textTitre.setLayoutY(labelY); /* Label Titre */ final Text textNomFemelle = new Text(event.getNomFemelle()); textNomFemelle.setId("textNomFemelle" + textNomFemelle.getText() + ID); textNomFemelle.getStyleClass().add("labelsPane"); textNomFemelle.setTextOrigin(VPos.TOP); labelsPane.getChildren().add(textNomFemelle); labelsPane.toFront(); applyCss(); System.out.println("textTitre: " + textNomFemelle.toString()); labelX = clamp(cadrePointX - textNomFemelle.getBoundsInLocal().getWidth() / 2d + 100); labelY = clamp(cadrePointY + 29); System.out.println("labelX: " + labelX + " labelY: " + labelY); textNomFemelle.setLayoutX(labelX); textNomFemelle.setLayoutY(labelY); /* Label date */ // Text textDates = new Text((event.getDate().format(DateTimeFormatter.ISO_LOCAL_DATE)); Text textDates = new Text(event.dateProperty().get().format(DateTimeFormatter.ISO_LOCAL_DATE)); /* if(event.dateFinProperty().get() != null) { Si date de fin == null alors l'evenement ne couvre pas un intervalle de date donc on affiche seulement date-debut textDates = new Text(event.dateProperty().get().format(DateTimeFormatter.ISO_LOCAL_DATE) + " à " + event.dateFinProperty().get().format(DateTimeFormatter.ISO_LOCAL_DATE)); //System.out.println(textDates.getText()); } */ textDates.setId("textDates" + textDates.getText() + ID); textDates.getStyleClass().add("labelsPane"); textDates.setTextOrigin(VPos.TOP); labelsPane.getChildren().add(textDates); labelsPane.toFront(); applyCss(); System.out.println("textTitre: " + textDates.toString()); labelX = clamp(cadrePointX - textDates.getBoundsInLocal().getWidth() / 2d + 100); labelY = clamp(cadrePointY + 104); System.out.println("labelX: " + labelX + " labelY: " + labelY); textDates.setLayoutX(labelX); textDates.setLayoutY(labelY); final Path vecteurBulle = new Path(); vecteurBulle.setId("vecteurBulle" + ID); vecteurBulle.getStyleClass().add("ligneBulle"); this.getChildren().add(vecteurBulle); vecteurBulle.toBack(); double vBulleY = cadrePointY + cadre.getPrefHeight(); double vBulleX = cadrePointX + cadre.getPrefWidth()/2; vecteurBulle.getElements().add(new MoveTo(vBulleX, vBulleY)); vecteurBulle.getElements().add(new LineTo(vBulleX, axisY)); final Circle pointLigneBulle = new Circle(); pointLigneBulle.setCenterX(vBulleX); pointLigneBulle.setCenterY(axisY+5); pointLigneBulle.setRadius(4f); pointLigneBulle.setFill(Color.DARKTURQUOISE); pointLigneBulle.setId("pointLigneBulle" + ID); pointLigneBulle.getStyleClass().add("pointLigneBulle"); this.getChildren().add(pointLigneBulle); }
A+
Nemo
Partager