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] Comment obtenir la largeur et la hauteur d'un graphique


Sujet :

2D Java

  1. #1
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 61
    Points : 44
    Points
    44
    Par défaut [JFreeChart] Comment obtenir la largeur et la hauteur d'un graphique
    Bonjour,
    j'aimerais savoir comment je peux obtenir la largeur et la hauteur en pixel de mon graphique JFreechart (entre l'orgine du repère et la limite haute (upperBound) sur chaque axe).
    J'ai vu qu'il y avait un ChartArea, un DataArea et un PlotArea dans le ChartRenderingInfo de mon PanelChart mais je ne sais pas à quoi ils correspondent exactement. Donc si je pouvais avoir des précisions sur chacune de ces area.
    merci

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    383
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 383
    Points : 468
    Points
    468
    Par défaut
    Tu as essayé ça ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    chartFrame.getContentPane().getWidth()
    chartFrame.getContentPane().getHeight()

  3. #3
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 61
    Points : 44
    Points
    44
    Par défaut
    ça donne les dimensions du ContentPane. Ce n'est pas ce que je recherche.
    Voici une image pour mieux illustrer ce que je recherche.

    L'image représente mon JPanel qui contient un ChartPanel (meme dimension que le JPanel) dans lequel on trouve le graphique.
    Je recherche la hauteur et la largeur du graphique, donc de la zone entourée en vert.

  4. #4
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 61
    Points : 44
    Points
    44
    Par défaut
    J'ai fait un essai en affichant les contours du dataArea qui l'on trouve dans chartPanel.getChartRenderingInfo().getPlotInfo().getDataArea() et en redimensionnant ma fenêtre.
    Tant que la fenêtre a de petite dimension le dataArea corresponds bien au contour du graphique. Cependant le dataArea semble limité en taille (708.03125 en largeur et 554.328125 en hauteur). A partir de cette taille on peut agrandir la fenêtre et donc le graphique mais le dataArea reste fixe.
    Est-ce que quelqu'un a remarqué la même chose?
    ça m'embête un peu, ça m'empêche de faire de grand graphique...

    Voici le code si vous voulez tester:
    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
    import java.awt.BorderLayout;
     
    import javax.swing.JFrame;
     
    public class TestDataArea extends JFrame {
     
    	public TestDataArea() {
    		this.setBounds(0, 0, 800, 600);
    		this.setLayout(new BorderLayout());
    		JPanelTest panel = new JPanelTest();
    		this.add(panel);
    		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		this.setVisible(true);
    	}
     
    	public static void main(String[] args) {
    		new TestDataArea();
    	}
    }
    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
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.geom.Rectangle2D;
     
    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.XYDataItem;
    import org.jfree.data.xy.XYSeries;
    import org.jfree.data.xy.XYSeriesCollection;
     
     
    public class JPanelTest extends JPanel {
     
    	private JFreeChart chart;
    	private ChartPanel panelChart;
    	private XYSeries _series;
     
    	public JPanelTest() {
    		this.setLayout(new BorderLayout());
    		_series = new XYSeries("Bidon");
    		_series.add(new XYDataItem(5,5));
    		chart = ChartFactory.createScatterPlot(null, "X", "Y",
    				new XYSeriesCollection(_series),
    				PlotOrientation.VERTICAL, false, true, false);
    		panelChart = new ChartPanel(chart);
    		this.add(panelChart);
    	}
     
    	@Override
    	public void paint(Graphics g2d) {
    		super.paint(g2d);
    		Rectangle2D dataArea = panelChart.getChartRenderingInfo().getPlotInfo().getDataArea();
    		while (dataArea.getWidth() == 0) {
    			try {
    				System.out.println("thread sleep 100ms");
    				Thread.sleep(100);
    			} catch (InterruptedException e) {
    				e.printStackTrace();
    			}
    			dataArea = panelChart.getChartRenderingInfo().getPlotInfo().getDataArea();
    		}
    		System.out.println("frame bounds: "+this.getBounds());
    		System.out.println("dataArea(green): "+dataArea);
    		g2d.setColor(Color.GREEN);
    		g2d.drawRect((int)dataArea.getX(), (int)dataArea.getY(), (int)dataArea.getWidth(), (int)dataArea.getHeight());
    		Rectangle2D plotArea = panelChart.getChartRenderingInfo().getPlotInfo().getPlotArea();
    		System.out.println("plotArea(red): "+plotArea);
    //		g2d.setColor(Color.RED);
    //		g2d.drawRect((int)plotArea.getX(), (int)plotArea.getY(), (int)plotArea.getWidth(), (int)plotArea.getHeight());
    		Rectangle2D chartArea = panelChart.getChartRenderingInfo().getChartArea();
    		System.out.println("chartArea(blue): "+chartArea);
    //		g2d.setColor(Color.BLUE);
    //		g2d.drawRect((int)chartArea.getX(), (int)chartArea.getY(), (int)chartArea.getWidth(), (int)chartArea.getHeight());
    	}
    }

  5. #5
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 61
    Points : 44
    Points
    44
    Par défaut
    problème résolu.
    c'est bien le dataArea qui donne la taille du graphique.
    Le problème venait de mon appel de la fonction draw du JFreechart auquel je passait comme dernier paramètre new ChartRenderingInfo() au lieu de passer le chartRenderingInfo de mon ChartPanel...

  6. #6
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 61
    Points : 44
    Points
    44
    Par défaut
    En fait mon problème n'est pas résolu. Au moment de l'affichage, les coordonnées du dataArea sont bonnes mais juste après elles sont modifiées et deviennent fausses alors que le graphique à l'écran n'a pas changé de dimension.
    Est-ce que quelqu'un pourrait essayer le code suivant pour savoir s'il obtient les mêmes résultats que moi?
    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
    import java.awt.BorderLayout;
     
    import javax.swing.JFrame;
     
    public class TestDataArea extends JFrame {
     
    	public TestDataArea() {
    		this.setBounds(0, 0, 800, 600);
    		this.setLayout(new BorderLayout());
    		JPanelTest panel = new JPanelTest();
    		this.add(panel);
    		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		this.setVisible(true);
    	}
     
    	public static void main(String[] args) {
    		new TestDataArea();
    	}
    }
    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
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.geom.Rectangle2D;
     
    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.XYDataItem;
    import org.jfree.data.xy.XYSeries;
    import org.jfree.data.xy.XYSeriesCollection;
     
     
    public class JPanelTest extends JPanel {
     
    	private JFreeChart chart;
    	private ChartPanel panelChart;
    	private XYSeries _series;
     
    	public JPanelTest() {
    		this.setLayout(new BorderLayout());
    		_series = new XYSeries("Bidon");
    		_series.add(new XYDataItem(5,5));
    		chart = ChartFactory.createScatterPlot(null, "X", "Y",
    				new XYSeriesCollection(_series),
    				PlotOrientation.VERTICAL, false, true, false);
    		panelChart = new ChartPanel(chart);
    		this.add(panelChart);
    	}
     
    	@Override
    	public void paint(Graphics g2d) {
    		super.paint(g2d);
    		Rectangle2D dataArea = panelChart.getChartRenderingInfo().getPlotInfo().getDataArea();
    		while (dataArea.getWidth() == 0) {
    			try {
    				System.out.println("thread sleep 100ms");
    				Thread.sleep(100);
    			} catch (InterruptedException e) {
    				e.printStackTrace();
    			}
    			dataArea = panelChart.getChartRenderingInfo().getPlotInfo().getDataArea();
    		}
    		System.out.println("frame bounds: "+this.getBounds());
    		System.out.println("dataArea(green): "+dataArea);
    		g2d.setColor(Color.GREEN);
    		g2d.drawRect((int)dataArea.getX(), (int)dataArea.getY(), (int)dataArea.getWidth(), (int)dataArea.getHeight());
    	}
    }
    Mon constat avec ce code est que les coordonnées du dataArea sont bonnes si la fenêtre est petite (le rectangle vert correspond au contour du graphique) mais arrivé à une certaine limite (708.03125 en largeur et 554.328125 en hauteur), le dataArea ne va pas au delà, donc devient faux si le graphique et plus grand que ces limites.

    Vous constatez la même chose? Y a-t-il une erreur dans mon code ou une modification à faire pour que ça marche?

  7. #7
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 61
    Points : 44
    Points
    44
    Par défaut
    En fait, il fallait utiliser le getScreenDataArea du panelChart et non pas le DataArea.
    Mon problème est résolu.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 14/06/2009, 22h50
  2. Réponses: 15
    Dernier message: 04/06/2008, 13h26
  3. Réponses: 2
    Dernier message: 06/06/2006, 14h59
  4. [IMAGE] Comment obtenir hauteur largeur d'une image ??
    Par pouillou dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 05/05/2006, 22h38

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