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] diagramme de Gantt


Sujet :

2D Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 42
    Points : 17
    Points
    17
    Par défaut [JFreeChart] diagramme de Gantt
    Salut tout le monde,

    Je suis débutant dans l'utilisation de JFreeChart que je dois utiliser pour afficher des diagrammes de Gantt.
    Au fait je voudrais personnaliser l'axe des temps de mon diagramme de Gantt pour qu'il soit gradué de 0 à la date de fin de la dernière tâche par pas de 1. Ceci étant, je voudrais qu'il m'affiche le diagramme de Gantt avec les valeurs de dates de début et de fin de chaque tache qui sont des entiers, mais j'arrive pas à trouver comment faire.

    Si vous pouvez m'aider avec des exemples, suggestions, liens de tuto ou de cours... vos réponses sont les bienvenues. car je trouve peu d'exemple sur les diagrammes de Gantt avec Jfreechart et que la plupart utilise les dates en jour-mois-année... , ce que je ne veux pas avoir.

    Merci de votre réponse.

  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
    Je suppose que les dates que tu as sous forme d'entiers représentent des jours de 1 à 31 non ?

    L'idéal serait d'avoir des dates sur lesquelles tu appliques un format pour n'afficher que les jours.

    Quelque chose du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
         DateAxis dateAxis=(DateAxis) categoryplot.getRangeAxis() ;
         DateFormat dateFormat=new SimpleDateFormat("dd") ;
         dateAxis.setDateFormatOverride(dateFormat) ;
         dateAxis.setTickUnit(new DateTickUnit(DateTickUnit.DAY, 1));
    Modératrice Java - Struts, Servlets/JSP, ...

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 42
    Points : 17
    Points
    17
    Par défaut
    Bonjour et merci de ta réponse

    J'ai essayé d'ajouter le bout de code, mais ca m'enlève complètement la graduation.
    J'ai mis les 2 diagrammes en pièces jointes.

    Au fait la graduation se fait par rapport aux durées d'exécution de l'ensemble des opérations. Par exemple, si la premiere opération a une durée de 5, la seconde 10 et la 3eme 20 . Ce qui fait que l''axe des abscisses sera gradué de 0 à 35 et non de 0 à 31.
    Images attachées Images attachées   

  4. #4
    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
    Il est normal que ça ne fonctionne pas avec le bout de code que j'ai donné car celui-ci fonctionne si tes données représentent des jours.
    Or, dans ton cas, ce sont des durées.

    Comment fais-tu pour afficher les durées ?
    tu les as en secondes et tu appliques un format dessus ?

    Peux-tu montrer un peu de code ?
    Modératrice Java - Struts, Servlets/JSP, ...

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 42
    Points : 17
    Points
    17
    Par défaut
    Voila la classe qui me permet d'afficher le diagramme:

    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
     
    public class SwingExempleGantt extends ApplicationFrame{
     
    	public SwingExempleGantt(String title)
    	{
    	    super(title);
    	    JFrame frame = new JFrame("Hello World!");
    	    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    	    JPanel panel;
    	    panel = new JPanel(new BorderLayout()); 
     
    	    IntervalCategoryDataset dataset = createDataset();
     
            final JFreeChart chart = ChartFactory.createGanttChart(
                    "Diagramme de Gantt",  // chart title
                    "Machines",              // domain axis label
                    "Durée",              // range axis label
                    dataset,             // data
                    true,                // include legend
                    true,                // tooltips
                    false                // urls
                );
     
            final CategoryPlot plot = (CategoryPlot) chart.getPlot();
            // plot.getDomainAxis().setMaxCategoryLabelWidthRatio(10.0f);
            final CategoryItemRenderer renderer = plot.getRenderer();
            CategoryItemLabelGenerator generator = new    StandardCategoryItemLabelGenerator("{2}", new DecimalFormat("0.00"));
            renderer.setBaseItemLabelGenerator(generator);
     
            plot.getRenderer().setSeriesPaint(0, new Color(128, 0, 0));
            plot.getRenderer().setSeriesPaint(1, new Color(0, 0, 255));
            renderer.setSeriesPaint(0, Color.blue);
            renderer.setBaseItemLabelsVisible(true);
     
            // Imposer que les étiquettes des graduations de l'axe des ordonnées soient des entiers
     
           // add the chart to a panel...
            ChartPanel chartPanel = new ChartPanel(chart,
            					true,  //propreties
            					true,  //save
            					true,	//print
            					true,	//zoom
            					true);	//tooltips
     
            chartPanel.setPreferredSize(new java.awt.Dimension(400, 270));
            setContentPane(chartPanel);
     
            setContentPane(panel); 
    	    setSize(600, 350); 
            panel.add(chartPanel);
     
    	    frame.pack();
    	    frame.setLocationRelativeTo(null);
    	    frame.setVisible(true);
    	}
     
     
    	/**
         * Creates a sample dataset for a Gantt chart.
         *
         * @return The dataset.
         */
     
        public static IntervalCategoryDataset createDataset() {
     
            TaskSeries s1 = new TaskSeries("Scheduled");
     
            // Machine1
            final Task M1 = new Task("Machine M1",
    				new SimpleTimePeriod( new Integer(2), new Integer(15)));
     
    				//sous tache1
    				final Task O1 = new Task("O1",
    						new SimpleTimePeriod( new Date(2), new Date(7)));
    				O1.setPercentComplete(1.0);
     
    				// sous tache2
    				final Task O2 = new Task("O2",
    						new SimpleTimePeriod( new Date(10), new Date(15)));
    				O2.setPercentComplete(1.0);
     
    				//ajout des sous taches 
    				M1.addSubtask(O1);
    				M1.addSubtask(O2);
    				s1.add(M1);
     
    		// Machine2
            final Task M2 = new Task("Machine M2",
    				new SimpleTimePeriod( new Date(0), new Date(10)));
     
            		//sous tache21: operation O3
    				final Task O3 = new Task("O3",
    								new SimpleTimePeriod( new Date(0), new Date(7)));
    				O3.setPercentComplete(1.0);
     
    				// sous tache22: opereration O4
    				final Task O4 = new Task("O4",
    								new SimpleTimePeriod( new Date(5), new Date(10)));	
    				O4.setPercentComplete(1.0);
     
     
    				//ajout des sous taches 
     
    				M2.addSubtask(O3);
    				M2.addSubtask(O4);
    				s1.add(M2);		
     
            TaskSeriesCollection collection = new TaskSeriesCollection();
            collection.add(s1);
     
            return collection;
        }
     
        /**
         * Utility method for creating <code>Date</code> objects.
         *
         * @param day  the date.
         * @param month  the month.
         * @param year  the year.
         *
         * @return a date.
         */
        private static Date date(int day, int month, int year) {
     
            Calendar calendar = Calendar.getInstance();
            calendar.set(year, month, day);
            Date result = calendar.getTime();
            return result;
        }
     
     
        /**
         * Creates a chart.
         * 
         * @param dataset  the dataset.
         * 
         * @return The chart.
         */
        private JFreeChart createChart(IntervalCategoryDataset dataset) {
            JFreeChart chart = ChartFactory.createGanttChart(
                "Gantt Chart Demo",  // chart title
                "Task",              // domain axis label : domaine des ordonnées Tache Num
                "Date",              // range axis label : domaine des abcsisses
                dataset,             // data
                true,                // include legend
                true,                // tooltips
                false                // urls
            );    
            chart.getCategoryPlot().getDomainAxis().setMaximumCategoryLabelWidthRatio(10.0f);
            return chart;    
        }
     
    }

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 42
    Points : 17
    Points
    17
    Par défaut
    Je veux avoir quelque chose du genre, comme l'image en pièce jointe.
    Images attachées Images attachées  

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 42
    Points : 17
    Points
    17
    Par défaut
    Après quelques modifs, j'arrive à obtenir ça, mais ce n'est vraiment pas encore ce que je veux. Car je ne voit pas comment incrémenter ou modifier les valeurs 01 01 ... (cf image) pour avoir 01 02 03 04 ... Sinon si j'arrive à graduer l'axe avec la durée de chaque opération aussi ca ira et se serait même l'idéal.

    Si quelqu'un a une idée de comment il faut procéder pour graduer l'axe des abscisses d'un diagramme de Gantt avec JFreeChart, elle est la bienvenue.

    Merci d'avance.
    Images attachées Images attachées  

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    103
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 103
    Points : 110
    Points
    110
    Par défaut
    Salut,

    J'ai installé JFreeChart pour la première fois aujourd'hui et je ne suis donc pas en mesure de t'aider
    En fait, je me me demandais si tu avais trouvé une réponse à ton problème car je veux faire le même genre de truc.

    Je vais continuer à me familiariser avec JFreeChart puis je m'attaque à notre problème

    Merci d'avance.

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 42
    Points : 17
    Points
    17
    Par défaut
    J'ai pas encore totalement résolu le problème et cherche encore...
    Par contre, je voudrais aussi changer la couleur des sous-tâches mais j'y arrive pas encore.

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    103
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 103
    Points : 110
    Points
    110
    Par défaut
    Salut,

    J'ai créer un nouveau topic sur le forum de jfreechart pour parler du XYTaskdataset personnalisé que j'utilise : Forum jfreechart
    Je trouvais le GanttDataset un peu contraignant. Tu peux peut-être jeter un coup d'oeil pour voir.

    Sinon, j'ai trouvé un moyen très simple de mettre les dates en nombres entiers :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    // création des taches
     Task t = new Task("Tasks with subtasks",new TimePeriod(new Date(0), new Date(5)));
    //...
    //formatage de l'axe
    if (rangeAxis instanceof DateAxis) {
    			DateAxis axis = (DateAxis) rangeAxis;
    			DateFormat formatter = new IntegerDateFormat();
    			DateTickUnit unit = new DateTickUnit(DateTickUnit.MILLISECOND, 10, formatter);
    			axis.setTickUnit(unit);
    		}
    Concernant, le formatage des sous-tâches, tu peux jeter un coup d'oeil au forum, il y a déjà des Topics sur ce sujet.

    Par contre, si tu arrives à modéliser le fait qu'un tâche occupe plusieurs ressources, je suis preneur.

    ++
    Arnaud

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 42
    Points : 17
    Points
    17
    Par défaut
    merci pour ton aide
    Le "rangeAxis" correspond à quoi au niveau du formatage de l'axe et il est de quel type?
    De même que le type "IntegerDateFormat", c'est un type ou classe que tu as créer ou bien?

    Et pour les ressources dont tu parles, il s'agit des ressources qui seront en ordonnées?
    j'ai pas encore la solution, mais je pense qu'on pourrait jouer sur la largeur des tâches. Je vais chercher et je te dirais si j'ai la solution...

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    103
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 103
    Points : 110
    Points
    110
    Par défaut
    Désolé pour le délai de la réponse.

    Je récupère le rangeAxis de mon plot.
    IntegerDateFormat est simplement un format pour les date qui écrit le nombre de millisecondes écoulées depuis l'origine.

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 42
    Points : 17
    Points
    17
    Par défaut
    Salut,
    Merci pour votre réponse. Mais j'ai résolu le problème en jouant sur les valeur en paramètre de setPercentComplete(val). Dans mon code plus haut, j'ai procédé de la sorte: Et donc j'avais des couleurs différentes pour les sous tâches si ça peut aider quelqu'un.

    O1.setPercentComplete(1.0);
    O2.setPercentComplete(0.0);

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 07/05/2010, 12h15
  2. Réponses: 1
    Dernier message: 30/07/2008, 17h43
  3. Réponses: 0
    Dernier message: 13/12/2007, 17h34
  4. Diagramme de Gantt avec JFreeChart 1.0.3 Demo
    Par mediateur59 dans le forum BIRT
    Réponses: 4
    Dernier message: 28/04/2007, 00h22
  5. algo de diagramme de Gantt
    Par nanarr dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 25/05/2005, 09h02

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