2010-07-12 7 views
3

Je suis en train de faire défiler mon XYBarChart horizontalement, je suivais une des Demo « TranslateDemo1.java » du jfreechart dans lequel le code source, vous pouvez trouver ici:jfreechart: Faire défiler XYBarChart Horizontalement - (traduction graphique et navigation)

http://code.google.com/p/cori-chenxx/source/browse/aliper/trunk/aliper-core/src/test/java/com/alibaba/aliper/TranslateDemo1.java?spec=svn148&r=148

Le code source fonctionne correctement pour un "TimeSeriesChart".

Cependant, j'ai essayé avec "XYBarChart" et quand je glisse la barre, le comportement n'est pas le même.

Pour être clair, j'ai remplacé la ligne # 157 avec le code source suivant:

JFreeChart chart1= ChartFactory.createXYBarChart(
       "Title", 
       null, 
       true, 
       "Ylabel", 
       xyDatasetTranslating, 
       PlotOrientation.VERTICAL, 
       true, 
       true, 
       false); 

Est-ce que quelqu'un sait pourquoi l'application se comporte de cette façon? et comment je pourrais peut-être y remédier.

Merci,

Répondre

8

Voici un code source qui mettent en œuvre une solution simple.

TranslateDemo screenshot

import java.awt.BorderLayout; 
import java.util.Date; 

import javax.swing.BorderFactory; 
import javax.swing.JPanel; 
import javax.swing.JSlider; 
import javax.swing.border.Border; 
import javax.swing.event.ChangeEvent; 
import javax.swing.event.ChangeListener; 

import org.jfree.chart.ChartPanel; 
import org.jfree.chart.JFreeChart; 
import org.jfree.chart.axis.DateAxis; 
import org.jfree.chart.axis.NumberAxis; 
import org.jfree.chart.plot.XYPlot; 
import org.jfree.chart.renderer.xy.XYBarRenderer; 
import org.jfree.data.time.DateRange; 
import org.jfree.data.time.Day; 
import org.jfree.data.time.RegularTimePeriod; 
import org.jfree.data.time.TimeSeries; 
import org.jfree.data.time.TimeSeriesCollection; 
import org.jfree.ui.ApplicationFrame; 
import org.jfree.ui.RefineryUtilities; 

public class DomainTranslateDemo extends ApplicationFrame { 

    private static class DemoPanel extends JPanel implements ChangeListener { 

     private static int SLIDER_INITIAL_VALUE = 50; 
     private JSlider slider; 
     private DateAxis domainAxis; 
     private int lastValue = SLIDER_INITIAL_VALUE; 

     // one month (milliseconds, seconds, minutes, hours, days) 
     private int delta = 1000 * 60 * 60 * 24 * 30; 

     public DemoPanel() { 
      super(new BorderLayout()); 
      JFreeChart chart = createChart(); 
      ChartPanel chartPanel = new ChartPanel(chart); 
      chartPanel.setPreferredSize(new java.awt.Dimension(600, 270)); 
      chartPanel.setDomainZoomable(true); 
      chartPanel.setRangeZoomable(true); 
      Border border = BorderFactory.createCompoundBorder(
       BorderFactory.createEmptyBorder(4, 4, 4, 4), 
       BorderFactory.createEtchedBorder() 
      ); 
      chartPanel.setBorder(border); 
      add(chartPanel); 

      JPanel dashboard = new JPanel(new BorderLayout()); 
      dashboard.setBorder(BorderFactory.createEmptyBorder(0, 4, 4, 4)); 

      this.slider = new JSlider(0, 100, SLIDER_INITIAL_VALUE); 
      this.slider.addChangeListener(this); 
      dashboard.add(this.slider); 
      add(dashboard, BorderLayout.SOUTH); 
     } 

     private JFreeChart createChart() { 

      TimeSeriesCollection timeSeriesCollection = new TimeSeriesCollection(); 
      TimeSeries series = createSerie(500,20); 
      timeSeriesCollection.addSeries(series); 

      this.domainAxis = new DateAxis("Time"); 
      NumberAxis rangeAxis = new NumberAxis(""); 
      XYBarRenderer renderer = new XYBarRenderer(); 
      renderer.setShadowVisible(false); 
      XYPlot plot = new XYPlot(timeSeriesCollection, domainAxis, rangeAxis, renderer); 

      JFreeChart chart = new JFreeChart(
        "Title", 
        JFreeChart.DEFAULT_TITLE_FONT, 
        plot, 
        true); 
      // performance 
      chart.setAntiAlias(false); 
      return chart; 
     } 

     private TimeSeries createSerie(int domainCount,int rangeCount) { 
      TimeSeries timeSeries = new TimeSeries("timeSeries1"); 
      Day d = new Day(new Date()); 
      RegularTimePeriod regularTimePeriod = d.next(); 
      for (int index = 0; index < domainCount; index++) { 
       if (index % 2 == 0) { 
        double value = (Math.random() * rangeCount); 
        timeSeries.add(regularTimePeriod,value); 
       } 
       regularTimePeriod = regularTimePeriod.next(); 
      } 
      return timeSeries; 
     } 

     @Override 
     public void stateChanged(ChangeEvent event) { 
      int value = this.slider.getValue(); 
      long minimum = domainAxis.getMinimumDate().getTime(); 
      long maximum = domainAxis.getMaximumDate().getTime(); 
      if (value<lastValue) { // left 
       minimum = minimum - delta; 
       maximum = maximum - delta; 
      } else { // right 
       minimum = minimum + delta; 
       maximum = maximum + delta; 
      } 
      DateRange range = new DateRange(minimum,maximum); 
      domainAxis.setRange(range); 
      lastValue = value; 
     } 

    } 

    public DomainTranslateDemo(String title) { 
     super(title); 
     setContentPane(new DemoPanel()); 
    } 

    public static JPanel createDemoPanel() { 
     return new DemoPanel(); 
    } 

    public static void main(String[] args) { 
     DomainTranslateDemo demo = new DomainTranslateDemo("Translate Demo"); 
     demo.pack(); 
     RefineryUtilities.centerFrameOnScreen(demo); 
     demo.setVisible(true); 
    } 

} 
+0

salut, votre code s'applique en barchart en utilisant Jfreechart (Eclipse RCP) ,,, toute idée & suggestion ... informer rapidement ... merci ... –

+0

@BharatZala Ça devrait, ça fait 7 ans que je n'utilise pas cette API. Faites-moi savoir si vous étiez en mesure d'utiliser ce code. – Max

1

TranslatingXYDataset met actuellement en XYDataset; à la place, vous devrez implémenter IntervalXYDataset, comme requis par JFreeChart.createXYBarChart.

+0

Eh oui, vous avez raison. MAIS toujours ne fonctionne pas :(. Quand j'implémente l'IntervalXYDataset au lieu de XYDataset je dois coder d'autres méthodes telles que: @Override public double getStartXValue (int série, int article) { return under.getStartXValue (série, élément) ; } @Override doubles de getEndXValue public (série int, point int) { retour underlying.getEndXValue (série, point); } Je ne sais pas quelles modifications supplémentaires dois-je faire sur le corps de ces méthodes. – Max

+0

@Max: Il semble que le moteur de rendu par défaut pour 'JFreeChart.createXYBarChart',' XYBarRenderer', ne soit pas content.Est-ce que 'setShadowVisible (false)' aide? – trashgod

1

Merci trashgod: D Mais j'ai abandonné cette approche. J'ai besoin de faire un peu de travail ici;) Donc, pour naviguer sur le graphique, j'ai utilisé un ensemble de données différent org.jfree.data.time.DynamicTimeSeriesCollection.

Cette classe est destinée aux applications en temps réel dans lesquelles nous avons la possibilité d'ajouter de nouvelles données et de rejeter les plus anciennes d'une manière assez rapide (en fonction de vos données d'entrée). En résumé, chaque fois que quelqu'un fait défiler la barre, j'ai juste besoin de changer mon jeu de données sous-jacent, et cela déclenchera un PlotChangeEvent qui, à son tour, sera transmis au graphique et aboutira à ChartChangeEvent. Cette série d'événements est utilisée pour s'assurer que les graphiques sont automatiquement mis à jour chaque fois qu'une modification est apportée à un composant du diagramme.

Encore une fois, merci beaucoup

+0

alternative raisonnable, et plus propre que la démo; +1 BTW, vous devez utiliser la balise '@' pour tout le monde sauf vous pour voir une réponse. – trashgod

+0

@trashgod: J'ai trouvé une nouvelle alternative, à bientôt. – Max

Questions connexes