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

JavaFX Discussion :

Region qui se multiplient


Sujet :

JavaFX

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2014
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2014
    Messages : 24
    Par défaut Region qui se multiplient
    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:
    Nom : GECanin004.jpg
Affichages : 127
Taille : 53,1 Ko

    Et voici quelques extraits de code que je trouve pertinent de vous montrer:

    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();
    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:
    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?

    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();
        };
    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
    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);
     
     
    }
    À la demande, je pourrais joindre un zip de mon projet complet à cette discussion.
    A+
    Nemo

  2. #2
    Membre éclairé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2014
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2014
    Messages : 24
    Par défaut
    Recoucou,

    Finalement, pour prendre les devants, j'ai décidé de mettre disponible mon code en l'état actuel, pour ceux qui souhaiterais se plonger dedans plus profondément pour m'aider. (Je remercie énormément ces dernier d'avance!)

    Donc voir fichier joint:

    A+
    Fichiers attachés Fichiers attachés

  3. #3
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 904
    Billets dans le blog
    54
    Par défaut
    Dans TimeLineView, ta méthode layoutChildrenInArea() invoque placeEvenements() a chaque nouvelle en page. Or cette méthode ne fait qu'ajouter des nouvelles régions sans jamais réutiliser ou retirer les anciennes.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

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

Discussions similaires

  1. Base ACCESS qui se multiplie ?
    Par NATOU2 dans le forum Access
    Réponses: 9
    Dernier message: 18/11/2011, 09h12
  2. [AC-2002] Problème sur la Fonction Sum() qui est multipliée par le nombre de tuple
    Par b3rz3k dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 20/05/2011, 15h13
  3. arrêter un script shell qui se multiplie
    Par mamax29 dans le forum Linux
    Réponses: 3
    Dernier message: 18/03/2011, 16h06
  4. requetes qui se multiplie ou disparaissent
    Par gastoncs dans le forum Requêtes et SQL.
    Réponses: 9
    Dernier message: 02/10/2007, 08h04
  5. un fond d'écran qui ne se multiplie pas
    Par lnikolanta dans le forum Balisage (X)HTML et validation W3C
    Réponses: 8
    Dernier message: 23/09/2005, 16h03

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