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

Interfaces Graphiques en Java Discussion :

[JFreeChart] Regénérer le graphique


Sujet :

Interfaces Graphiques en Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    263
    Détails du profil
    Informations personnelles :
    Âge : 74
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 263
    Par défaut [JFreeChart] Regénérer le graphique
    Chers amateurs de JFreechart,

    J'utilise la bibliothèque JFreeChart v.1.0.10 (que j'ai achetée il y a bien 12 ans) et la documentation 'Developer Guide' de la version 1.0.5 (23 mars 2007).

    Mon application GUI comporte un graphique temporel avec XYDataset. J'affiche le premier 'tab' avec tous les boutons, tableaux, champs de texte ... et, en-dessous, un graphique sans courbe : Dans ma fonction d'initialisation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            jeuDonnéesGraphTempor = new JeuDonnéesGraphTempor(tablePrinc);
            chart = createChart(null);              // createDataset()
            chartPanel = new ChartPanel(chart);
            chartPanel.setPreferredSize(new Dimension(500, 270));
    ainsi que dans mon 'GroupLayout' :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        .addComponent(chartPanel, GroupLayout.PREFERRED_SIZE, LARGEUR_GRAPHIQUE, GroupLayout.PREFERRED_SIZE)
    Ce n'est que lorsque les champs de texte et les tableaux ont été remplis que le jeu de donnée peut être constitué. L'utilisateur actionne alors un bouton pour générer le dataset ainsi que regénérer le graphique avec, cette fois-ci, les courbes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
            if (e.getSource() == bout_GénérGraphique)
            {
                moyHebdPuiss = jeuDonnéesGraphTempor.calculMoyHebdPuiss(tablePrinc);
                xyDataset = createDataset(moyHebdPuiss);
                createChart(xyDataset);
            }
    Problème n°I : Le graphique n'est pas regénéré, et cependant le dataset est rempli.

    Problème n°II : Les données fournies pour constituer le dataset sont des 'BigDecimal' d'une table. En examinant le 'dataset' - voir 'createDataset()' - j'observe que les valeurs sont au format 'Double', mais surtout qu'elles ont toutes été arrondies à l'unité. Comment les afficher avec deux décimales, par exemple ?
    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
        private /* static */ XYDataset createDataset(BigDecimal[][] moyHebdomPuiss)
        {
            TimeSeries série1 = new TimeSeries("Heures creuses", Month.class);
            TimeSeriesCollection dataset = new TimeSeriesCollection();
                    
            for (short i = 0 ; i < 12 ; i++)
            {   // Les 12 valeurs dans la série sont tous des 'doubles' arrondis à l'unité !
                série1.add(new Month(i+1, 2012), moyHebdPuiss[i][2].doubleValue());
            }
            
            dataset.addSeries(série1);
            dataset.setDomainIsPointsInTime(true);
            return dataset;
        }
        
        /**
         * Creates the chart.
         * @param dataset  the dataset.
         * @return The chart.
         */
        private /* static */ JFreeChart createChart(XYDataset dataset)
        {
            // Create the chart ...
            chart = ChartFactory.createTimeSeriesChart
                (   "Mesures quart-horaires de la consommation d'électricité",   // chart title
                    "Semaines",               // domain axis label - XY
                    "Puissance - KW",         // range axis label - Value
                    dataset,                  // data
                    false,                    // include legend
                    true,                     // tooltips?
                    false                     // URLs
                );
            
            // Now do some optional customization of the chart ...
            chart.setBackgroundPaint(Color.white);
    
            XYPlot plot = (XYPlot) chart.getPlot();
            plot.setBackgroundPaint(Color.lightGray);
            plot.setDomainGridlinePaint(Color.white);
            plot.setRangeGridlinePaint(Color.white);
            plot.setAxisOffset(new RectangleInsets(5.0, 5.0, 5.0, 5.0));
            plot.setDomainCrosshairVisible(true);
            plot.setRangeCrosshairVisible(true);
            
            XYItemRenderer r = plot.getRenderer();
            if (r instanceof XYLineAndShapeRenderer)
            {
                XYLineAndShapeRenderer renderer = (XYLineAndShapeRenderer) r;
                renderer.setBaseShapesVisible(true);
                renderer.setBaseShapesFilled(true);
            }
            
            DateAxis axis = (DateAxis) plot.getDomainAxis();
            axis.setDateFormatOverride(new SimpleDateFormat("yyyy-MMM"));
    
            return chart;
        }
    Merci bcp d'avance.

  2. #2
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Problème N°1: bah, il faudrait peut être penser à affecter ton nouveau chart au chartPanel qui est supposé l'afficher.

    Problème N°2: Pourquoi convertir ton nombre en double lorsque tu fais l'appel à la méthode add alors que la classe TimeSeries suporte les Numbers (donc les BigDecimal)?

    Quant à l'arrondi: http://www.jfree.org/jfreechart/faq.html#FAQ7

    (Disclaimer, je n'ai jamais fait de JFreeChart, donc avec un tant soit peu de recherche, c'est excessivement facile à trouver)

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    263
    Détails du profil
    Informations personnelles :
    Âge : 74
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 263
    Par défaut
    Bonsoir à tous,
    Et merci, Sinok, pour ta réponse.

    Citation Envoyé par sinok Voir le message
    Problème N°1: bah, il faudrait peut être penser à affecter ton nouveau chart au chartPanel qui est supposé l'afficher.
    Of course !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
            if (e.getSource() == bout_GénérGraphique)
            {
                moyHebdPuiss = jeuDonnéesGraphTempor.calculMoyHebdPuiss(tablePrinc);
                xyDataset = createDataset(moyHebdPuiss);
                chart = createChart(xyDataset);              // createDataset()
                // chartPanel.add(chart);       // No suitable method found for .add(JFreeChart)
                chartPanel = new ChartPanel(chart);
            }
    Mais le graphique avec la courbe n'apparaît toujours pas ...

    Merci d'avance.

  4. #4
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Pas tant of course que ça.

    Là, tu crées un nouveau ChartPanel dont tu ne fais absolument rien.
    L'ancien se trouvant encore dans ton GUI.

    La solution est donc de faire appel à la méthode set (et non add, faut peut être lire la javadoc de JFreeChart de temps à autre ).

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    263
    Détails du profil
    Informations personnelles :
    Âge : 74
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 263
    Par défaut
    Bonjour à tous et merci à Sinok.

    Citation Envoyé par sinok Voir le message
    La solution est donc de faire appel à la méthode set (et non add, faut peut être lire la javadoc de JFreeChart de temps à autre ).
    La classe ChartPanel dispose de 48 fonctions "set...", mais aucune pour remplacer un JFreeChart par un autre. Mais j'ai trouvé la solution (avec '.add()' quand même) : un ensemble d'instructions mises dans une fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        private void remplacementDuGraphique(XYDataset dataset)
        {
            chartPanel.removeAll();
            chartPanel.revalidate();    // Ote l'ancien graphique 
            chart = createChart(dataset); 
            // chart.removeLegend(); 
            ChartPanel chartPanel2 = new ChartPanel(chart); 
             chartPanel.add(chartPanel2); 
            chartPanel.repaint();       // Cette méthode fait apparaître le nouveau graphique
        }
    et cela fonctionne bien, c à d cela remplace un ancien JFreeChart par un neuf complètement recréé.

    Mieux encore : Modifier dynamiquement les courbes : How can I update a JFreeChart's appearance after it's been made visible ?

    Ces deux solutions ne figurent pas le moindre dans la Javadoc

    Sincère remerciement quand même, Sinok ...

  6. #6
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Ta solution semble ne pas avoir de sens, pourquoi aller mettre un ChartPanel dans un ChartPanel (techniquement c'est faisable, mais c'est purement incohérent).

    Et pour te répondre, si, le ChartPanel a une méthode setChart qui fait exactement ce que tu cherche à faire.

    http://www.jfree.org/jfreechart/api/....JFreeChart%29

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 07/08/2009, 19h36
  2. Réponses: 2
    Dernier message: 09/04/2009, 07h52
  3. [JFreeChart] Créer un graphique de statistiques
    Par neimad31 dans le forum 2D
    Réponses: 2
    Dernier message: 26/04/2007, 21h22
  4. [JFreeChart] Gestion de graphiques
    Par dedeloux dans le forum 2D
    Réponses: 6
    Dernier message: 21/11/2006, 11h34
  5. [JfreeChart] Graphique en radar
    Par serwol dans le forum 2D
    Réponses: 8
    Dernier message: 12/01/2006, 12h44

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