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

2D Java Discussion :

[JFreeChart] bug décalage d'un jour


Sujet :

2D Java

  1. #1
    Membre régulier
    Inscrit en
    Janvier 2006
    Messages
    716
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 716
    Points : 112
    Points
    112
    Par défaut [JFreeChart] bug décalage d'un jour
    Bonjour, je rencontre des problème avec Jfrrechart et lorsque je trace des courbes sur une échelle de temps en abcisse.
    Sur les mois de janvier, févier, mars, octobre, novembre et décembre on peut remarquer un décalage !
    Je m'expliquer :
    pour le moi je mars on vois que le 18 mars n'est pas là pour l'année 2007 et pour octobre 2006 on vois qu'il y a 2 fois 29 octobre.
    Il y a donc un problème dans la création des date de l'api je pense, ce qui fait que cela décale tout!

    Voici deux screen en pièce jointe.
    SVP aidez moi c'est important!
    Images attachées Images attachées   

  2. #2
    Expert éminent

    Femme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 793
    Points : 7 778
    Points
    7 778
    Par défaut
    Quelle classe utilises-tu pour afficher les jours sur l'axe des abscisses ?
    DateAxis, PeriodAxis, ... ?
    Peux-tu montrer le bout de code concernant les dates ?
    Modératrice Java - Struts, Servlets/JSP, ...

  3. #3
    Membre régulier
    Inscrit en
    Janvier 2006
    Messages
    716
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 716
    Points : 112
    Points
    112
    Par défaut
    Voici mon code où j'ajoute mes dates :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    //création des données pour créer un timeseries
        private static TimeSeries createTimeSeries(String nom, double [] valeurs, String [] date)
        {
            TimeSeries timeseries = new TimeSeries(nom);
            for (int i=0;i<valeurs.length;i++)
            {
                String [] tab_temp = date[i].split("/");
                timeseries.add(new Day(Integer.parseInt(tab_temp[0]), Integer.parseInt(tab_temp[1]), Integer.parseInt(tab_temp[2])), valeurs[i]);
            }
            return timeseries;
        }
    J'utilise PeriodAxis et DateAxis.

    Pour period Axis tout est décalé, pour DateAxis le décalage apparâit seulement lorsque l'on passe la souris sur le point pour voir la date et la valeur du point.

    Je pense que cela est un bug de Jfrrecchart! J'ai contacter le leader, qui m'a confirmer cela. Cependant je cherche en vain à corriger ce bug et je pense avoir trovuer la solution. J'ai contacter le leader, mais je ne sais pas s'il va vouloir corriger cela dans de brefs délais.

    Voici mon raisonnement :

    je pense que l'erreur vient à la création de la date car je remarque que qu'avant l'erreur la date est de type PM et après de type AM.

    Je voudrais savoir s'il est possible de modifier les labels et de mettre leurs valeurs à celle de l'axe des abcisses (qui est bon).

    j'ai aussi essayer de forcer l'affichage des date en formattant en nombre et en comparant avec le timestamp les dates sont PRESQUE correctes!
    L'erreur ne peut donc venir que d'une bête erreur de conversion.
    En effet il y a une seconde de différence avec le bon timesStamp donc un léger décalage sur toutes les valeurs, ce qui entraîne ce bug!!!


    je pense que l'erreur peut venir de cette fonction qui retourne la mauvaise date de la classe AbstractXYItemLabelGenerator :
    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
     
    protected Object[] createItemArray(XYDataset dataset, int series, 
                                           int item) {
            Object[] result = new Object[3];
            result[0] = dataset.getSeriesKey(series).toString();
     
            double x = dataset.getXValue(series, item);
            if (Double.isNaN(x) && dataset.getX(series, item) == null) {
                result[1] = this.nullXString;
            }
            else {
                if (this.xDateFormat != null) {
                    result[1] = this.xDateFormat.format(new Date((long) x));   
                }
                else {
                    result[1] = this.xFormat.format(x);
                }
            }
     
            double y = dataset.getYValue(series, item);
            if (Double.isNaN(y) && dataset.getY(series, item) == null) {
                result[2] = this.nullYString;
            }
            else {
                if (this.yDateFormat != null) {
                    result[2] = this.yDateFormat.format(new Date((long) y));   
                }
                else {
                    result[2] = this.yFormat.format(y);
                }
            }
            return result;
        }
    Il faudrait donc rajouter : new Date((long) (y+1)) et le bug serait corrigé temporairement!
    Entre l'ajout et l'affichage, il y a visiblement une conversion en timestamp et une erreur avec un "-1" qui provoque ce bug.
    La corruption arrive lorsque l'on ajoute un TimeSeries à un TimeSeriesCollection.
    TimeSeries is good bug TimeSeriesCollection pas!


    En continuant à chercher, j'ai découvert la fonction de la classe TimeSeriesCollection qui renvoit le mauvais timestamp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    protected synchronized long getX(RegularTimePeriod period) {
            long result = 0L;
            if (this.xPosition == TimePeriodAnchor.START) {
                result = period.getFirstMillisecond(this.workingCalendar);
            }
            else if (this.xPosition == TimePeriodAnchor.MIDDLE) {
                result = period.getMiddleMillisecond(this.workingCalendar);
            }
            else if (this.xPosition == TimePeriodAnchor.END) {
                result = period.getLastMillisecond(this.workingCalendar); 
            }
            return result;
        }
    J'ai vérifier avant d'appeler cette fonction la valeur de la date est bonne avec getXValue et après cette fonction la valeur en timestamp est fausse!! L'erreur ne peut donc venir que de cette fonction.
    Il faudrait donc dans la logique faire ceci : result = (period.getMiddleMillisecond(this.workingCalendar))+1;
    Pouvez vous essayer de corriger cela et de tester si cela fonctionne mieu en regardant quelques graphiques de Timeseries et de publier le correctif. SVP c'est important pour mes études...


    Voila je pense que celui-ci est bon, et je voudrais savoir si oui. Mais je ne sais pas comment faire pour recompiler une librairie à partir des sources, pouvez vous m'expliquer cela?

  4. #4
    Membre régulier
    Inscrit en
    Janvier 2006
    Messages
    716
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 716
    Points : 112
    Points
    112
    Par défaut
    J'ai modifier le fichier RegularTimePeriod :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    ** 
    * Returns the millisecond closest to the middle of the time period, 
    * evaluated using the supplied calendar (which incorporates a timezone). 
    * 
    * @param calendar the calendar. 
    * 
    * @return The middle millisecond. 
    */ 
    public long getMiddleMillisecond(Calendar calendar) { 
    long m1 = getFirstMillisecond(calendar); 
    long m2 = getLastMillisecond(calendar); 
    return (m1 + (m2 - m1) / 2)+1; 
    }
    Je pense que c'est un problème d'intervalle!
    Tout fonctionne parfaitement, avec cette petite modification.
    J'ai contacter le leader de jfreechart par son forum, et lui est envoyer ce que j'ai modifier.
    J'espère qu'il pourra publier une nouvelle version corriger...
    Cependant je ne parle pas très bien anglais...

Discussions similaires

  1. InputCalendar: Décalage d'un jour de la date
    Par AmFaye dans le forum JSF
    Réponses: 2
    Dernier message: 13/07/2009, 14h04
  2. Réponses: 0
    Dernier message: 03/10/2008, 10h58
  3. Réponses: 1
    Dernier message: 10/03/2008, 17h40
  4. Réponses: 1
    Dernier message: 18/04/2007, 11h28

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