Java: jFreeChart dans un JPanel

Résolu/Fermé
Remad Messages postés 1662 Date d'inscription mardi 27 mai 2008 Statut Membre Dernière intervention 27 juillet 2012 - 22 juil. 2012 à 17:51
Remad Messages postés 1662 Date d'inscription mardi 27 mai 2008 Statut Membre Dernière intervention 27 juillet 2012 - 27 juil. 2012 à 19:02
Bonjour à tous,
Je suis en train de produire un programme pour valider mon master qui ressemble à une simulation aérienne, et je dois afficher des graphiques en temps réel sur l'état du joystick et des surfaces de contrôle de l'avion. J'ai cru comprendre que jFreeChart était la meilleur solution pour cela avec la fonction XYSplineRender: https://www.jfree.org/jfreechart/images/XYSplineRendererDemo1a.png (si je me trompe, dites-le moi).
Seulement voila, j'ai commencé à faire mon IHM avec l'interface de NetBeans (qui pour le moment se compose d'une JFrame avec 3 JLabel et 1 JTabbedPane, qui lui même est composé de 3 JLabel) et je ne comprends pas comment faire pour implanter mes graphs dans une des JLabel qui se trouve dans la JTabbedPane. J'ai cru comprendre qu'il fallait implanter les graphs dans un chartPanel, mais je ne vois pas comment le faire comprendre à NetBeans.
Quelqu'un peut m'aider?

Merci d'avance!!
A voir également:

6 réponses

Utilisateur anonyme
26 juil. 2012 à 10:34
Salut!

Je ne vois pas bien ce que tu veux dire par "comment le faire comprendre à NetBeans"... il te suffit de taper le code nécessaire. A savoir un truc du style

JFrame frame = new JFrame("Démo");
...
Plot plot = ...//construire l'objet Plot

JFreeChart chart = JFreeChart("My chart demo", plot);
ChartPanel panel = new ChartPanel(chart);
...
frame.getContentPane().add(panel);


;-)
HackTrack
0
Remad Messages postés 1662 Date d'inscription mardi 27 mai 2008 Statut Membre Dernière intervention 27 juillet 2012 680
26 juil. 2012 à 11:24
Je pensais qu'on pouvait ajouter un objet de type ChartPanel dans le générateur de netbeans directement, mais aparemment non.

Pour le code, Qu'est ce que c'est ton objet plot? Sur internet, j'ai cru voir qu'il falait faire comme sa:
XYSeries series = ... //construire l'objet XYSeries
series.add(...); //ajouter les valeurs
XYSeriesCollection dataset = new XYSeriesCollection (series); //création du dataset

JFreeChart chart = ChartFactory.createXYLineChart(...);
ChartPanel CP = new ChartPanel(chart);


Et puis, j'aimerai que ce soit dans un JPanel qui est généré par Netbeans. Quand je veux faire sa:
graphicsPanel.add(CP);

J'ai une erreur qui dit en gros que je ne peux pas ajouter un ChartPanel dans un JPanel...
0
Utilisateur anonyme
26 juil. 2012 à 13:59
Salut!

Ce n'est qu'un exemple parmi d'autres que je t'ai donné afin de te montrer comment ajouter un ChartPanel à une JFrame

Tu peux aussi créer ton ChartPanel avec comme tu le montres ci-dessus.

L'important est que ChartPanel étend la classe JPanel. Tu peux donc l'ajouter sur le Container d'une JFrame (par exemple) comme je te l'ai montré dans le pseudo-code de mon post précédent.

De quel type de classe est ton objet graphicsPanel? Un JPanel?

;-)
0
Remad Messages postés 1662 Date d'inscription mardi 27 mai 2008 Statut Membre Dernière intervention 27 juillet 2012 680
26 juil. 2012 à 14:45
Oui, j'ai un peu changé le code, j'ai crée une classe graphics qui se présente comme sa pour le moment, elle est inspiré de cet exemple: http://www.java2s.com/Code/Java/Chart/JFreeChartMultipleDatasetDemo1.htm

package comet;

import java.awt.BorderLayout;
import javax.swing.JPanel;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.data.xy.XYDataset;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;

public class Graphics{

    private XYPlot plot;
    
    private XYSeriesCollection dataset;
    
    private JFreeChart chart;
    
    private JPanel content;
    
    private ChartPanel chartPanel;
    
    public Graphics (final String title) {
        
        dataset = createRandomDataset("Serie");
        
        chart = ChartFactory.createXYLineChart("title", "Axis 1", "Axis 2", (XYDataset) dataset, PlotOrientation.VERTICAL, true, true, false);
        
        plot = chart.getXYPlot();
        
        content = new JPanel(new BorderLayout());

        chartPanel = new ChartPanel(chart);
        content.add(chartPanel);
    }
    
    private XYSeriesCollection createRandomDataset(String name) {
        final XYSeries series = new XYSeries(name);
        double value = 100.0;
        for (int i = 0; i < 50; i++) {
            series.add(i, value);
            value = value * (1.0 + Math.random() / 100);
        }
        return new XYSeriesCollection(series);
    }

    public JPanel getContent() {
        return content;
    }
    
}

}


Et dans le constructeur de l'IHM, j'ai ajouté ces lignes:
Graphics test = new Graphics("coucou");
        JPanel graphic1 = test.getContent();
        joystickChartPanel.add(graphic1);


Du coup, j'ai plus d'erreur dans l'objet de l'IHM, mais toujours dans la classe Graphics au niveau de
content.add(chartPanel);
, lorsque je lance le programme: Exception in thread "main" java.lang.RuntimeException: Uncompilable source code - Erroneous sym type: javax.swing.JPanel.add
at comet.Graphics.<init>(Graphics.java:46)
at comet.Window.initCharts(Window.java:57)
at comet.Window.<init>(Window.java:51)
at comet.Comet.main(Comet.java:67)

Je commence à être perdu...
0
Remad Messages postés 1662 Date d'inscription mardi 27 mai 2008 Statut Membre Dernière intervention 27 juillet 2012 680
26 juil. 2012 à 14:48
Netbeans me sort cette erreur avant la compilation:

Error
no suitable method found for add(org.jfree.chart.ChartPanel)

method java.awt.Container.add(java.awt.Component,java.lang.Object,int) is not applicable
(actual and formal argument lists differ in length)

method java.awt.Container.add(java.awt.Component,java.lang.Object) is not applicable
(actual and formal argument lists differ in length)

method java.awt.Container.add(java.awt.Component,int) is not applicable
(actual and formal argument lists differ in length)

method java.awt.Container.add(java.lang.String,java.awt.Component) is not applicable
(actual and formal argument lists differ in length)

method java.awt.Container.add(java.awt.Component) is not applicable
(actual argument org.jfree.chart.ChartPanel cannot be converted to java.awt.Component by method invocation conversion)

method java.awt.Component.add(java.awt.PopupMenu) is not applicable
(actual argument org.jfree.chart.ChartPanel cannot be converted to java.awt.PopupMenu by method invocation conversion)
0
Utilisateur anonyme
26 juil. 2012 à 16:31
Vraiment bizarre car le code suivant tourne sans problème sous Eclipse et ton graphique s'affiche correctement.

package hacktrack.chartpanel;

import java.awt.BorderLayout;

import javax.swing.JFrame;
import javax.swing.JPanel;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.data.xy.XYDataset;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;

public class Graphics {

	private XYPlot plot;

	private XYSeriesCollection dataset;

	private JFreeChart chart;

	private JPanel content;

	private ChartPanel chartPanel;

	public Graphics(final String title) {

		dataset = createRandomDataset("Serie");

		chart = ChartFactory.createXYLineChart("title", "Axis 1", "Axis 2",
				(XYDataset) dataset, PlotOrientation.VERTICAL, true, true,
				false);

		plot = chart.getXYPlot();

		content = new JPanel(new BorderLayout());

		chartPanel = new ChartPanel(chart);
		content.add(chartPanel);
	}

	private XYSeriesCollection createRandomDataset(String name) {
		final XYSeries series = new XYSeries(name);
		double value = 100.0;
		for (int i = 0; i < 50; i++) {
			series.add(i, value);
			value = value * (1.0 + Math.random() / 100);
		}
		return new XYSeriesCollection(series);
	}

	public JPanel getContent() {
		return content;
	}

	public static void main(String[] args) {
		JFrame frame = new JFrame("Demo ChartPanel");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		Graphics test = new Graphics("coucou");
		JPanel graphic1 = test.getContent();
		JPanel joystickChartPanel = new JPanel();
		joystickChartPanel.add(graphic1);
		frame.getContentPane().add(joystickChartPanel);
		frame.pack();
		frame.setVisible(true);
	}
}


Ce ne serait pas un problème d'incompatibilité de version entre la librairie "jfreechart" et la librairie "jcommon"?

;-)
0
Utilisateur anonyme
26 juil. 2012 à 16:34
Et avec une Window, ça fonctionne aussi:

	public static void main(String[] args) {
		JFrame frame = new JFrame("Demo ChartPanel");
		Window win = new Window(frame);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		Graphics test = new Graphics("coucou");
		JPanel graphic1 = test.getContent();
		JPanel joystickChartPanel = new JPanel();
		joystickChartPanel.add(graphic1);
		win.add(joystickChartPanel);
		win.pack();
		win.setVisible(true);
	}
0
Remad Messages postés 1662 Date d'inscription mardi 27 mai 2008 Statut Membre Dernière intervention 27 juillet 2012 680
26 juil. 2012 à 17:52
Sa peut peut-être venir du fait que j'utilise java 7?
0
Remad Messages postés 1662 Date d'inscription mardi 27 mai 2008 Statut Membre Dernière intervention 27 juillet 2012 680
26 juil. 2012 à 18:27
J'utilise jFreeChart 1.0.14 et jCommon 1.0.17, soit les deux plus récentes
0
Remad Messages postés 1662 Date d'inscription mardi 27 mai 2008 Statut Membre Dernière intervention 27 juillet 2012 680
26 juil. 2012 à 18:40
Et je me demande si sa viendrait pas aussi de comment j'ai "installé" le truc. J'ai pris simplement les fichiers .jar et je les ai placés dans "src/ext/jfreechart", et je les ai importés dans NetBeans. J'ai eu tort? Il aurait fallu que je déplace tout et pas simplement les fichiers .jar?
0
Remad Messages postés 1662 Date d'inscription mardi 27 mai 2008 Statut Membre Dernière intervention 27 juillet 2012 680
26 juil. 2012 à 18:58
Sa ne vient pas de java en lui même. Je viens de tester avec java 6, sa me sort la même erreur...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Remad Messages postés 1662 Date d'inscription mardi 27 mai 2008 Statut Membre Dernière intervention 27 juillet 2012 680
27 juil. 2012 à 13:49
Je ne comprends plus rien... J'ai simplement copié mon code sur un autre PC, et la, sa fonctionne... A peu près... Je n'ai plus d'erreurs de code, mais les graphiques ne s'affichent pas...
Vous pouvez voir tout les fichiers ici: http://www.tech.dmu.ac.uk/~p09267388/
0
Remad Messages postés 1662 Date d'inscription mardi 27 mai 2008 Statut Membre Dernière intervention 27 juillet 2012 680
27 juil. 2012 à 15:12
J'ai compris pourquoi sa marchait sur mon autre pc: la version de NetBeans est la 7.2. Je suis passé de la version 7.1.2 à la 7.2, et sa fonctionne maintenant sur mon premier PC... Mais toujours pas de graphiques d'affichés...
0
Remad Messages postés 1662 Date d'inscription mardi 27 mai 2008 Statut Membre Dernière intervention 27 juillet 2012 680
27 juil. 2012 à 15:33
Avec Eclipse non plus...
0
Remad Messages postés 1662 Date d'inscription mardi 27 mai 2008 Statut Membre Dernière intervention 27 juillet 2012 680
Modifié par Remad le 27/07/2012 à 19:03
Sa fonctionne! Enfin! :D
Aparemment, il falait que je fasse des setLayout des jPanel, que j'ajoute mes ChartPanel et que j'appelle la fonction validate après!

J'ai renommé la classe Graphics en Chart:
package comet; 

import javax.swing.JPanel; 
import org.jfree.chart.ChartFactory; 
import org.jfree.chart.ChartPanel; 
import org.jfree.chart.JFreeChart; 
import org.jfree.chart.plot.PlotOrientation; 
import org.jfree.data.xy.XYDataset; 
import org.jfree.data.xy.XYSeries; 
import org.jfree.data.xy.XYSeriesCollection; 

public class Chart{ 
     
    //private XYPlot plot; 
    private XYSeriesCollection dataset; 
    private JFreeChart chart; 
    private ChartPanel chartPanel; 
     
    public Chart (final String title) { 
         
        dataset = createRandomDataset("Serie"); 
        chart = ChartFactory.createXYLineChart("title", "Axis 1", "Axis 2", (XYDataset) dataset, PlotOrientation.VERTICAL, true, true, false); 
         
        //plot = chart.getXYPlot(); 
         
        chartPanel = new ChartPanel(chart); 
    } 
     
    private XYSeriesCollection createRandomDataset(String name) { 
        XYSeries series = new XYSeries(name); 
        double value = 100.0; 
         
        for (int i = 0; i < 50; i++) { 
            series.add(i, value); 
            value = value * (1.0 + Math.random() / 100); 
        } 
         
        return new XYSeriesCollection(series); 
    } 

    public ChartPanel getChartPanel() { 
        return chartPanel; 
    }     
} 


Ensuite, le début du constructeur de mon IHM ressmeble à sa:
public class Window extends javax.swing.JFrame { 
     
    public Window(String name, boolean buttons, int buttonNumber, boolean thumb) { 
         
        initComponents(); 
        initCharts(); 
         
        this.setLocationRelativeTo(null); 
        this.name.setText(name); 
        this.buttons.setText(String.valueOf(buttons)); 
        this.buttonsNumber.setText(String.valueOf(buttonNumber)); 
        this.thumb.setText(String.valueOf(thumb)); 
         
        this.pack(); 
         
        this.setVisible(true); 
    } 
     
    private void initCharts() { 
        Chart test1 = new Chart("coucou1"); 
        ChartPanel graphic1 = test1.getChartPanel(); 
         
        joystickChartPanel.setLayout(new java.awt.BorderLayout()); 
        joystickChartPanel.add(graphic1, BorderLayout.CENTER); 
        joystickChartPanel.validate(); 
         
        Chart test2 = new Chart("coucou2"); 
        ChartPanel graphic2 = test2.getChartPanel(); 
         
         
        fcsChartPanel.setLayout(new java.awt.BorderLayout()); 
        fcsChartPanel.add(graphic2, BorderLayout.CENTER); 
        fcsChartPanel.validate(); 
         
        Chart test3 = new Chart("coucou3"); 
        ChartPanel graphic3 = test3.getChartPanel(); 
         
         
        fmChartPanel.setLayout(new java.awt.BorderLayout()); 
        fmChartPanel.add(graphic3, BorderLayout.CENTER); 
        fmChartPanel.validate(); 
    } 
//[...] Le code continue


En tout cas, merci pour ton aide!
0