2010-07-12 24 views
3

我試圖水平滾動我XYBarChart,我下面的JFreeChart的演示「TranslateDemo1.java」中的源代碼,你可以在這裏找到之一:的JFreeChart:滾動XYBarChart平鋪 - (圖翻譯和導航)

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

源代碼適用於「TimeSeriesChart」。

但是我嘗試過使用「XYBarChart」,當我滑動酒吧的行爲是不一樣的。

只是要清楚我取代了線#157與下面的源代碼:

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

有誰知道爲什麼應用程序以這種方式表現?以及我如何可能修復它。

謝謝,

回答

8

這裏是一個實現簡單解決方案的源代碼。

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

嗨,你的代碼適用於使用Jfreechart(Eclipse RCP)的條形圖,,,任何想法和建議......快速通知......謝謝... – 2017-05-05 09:12:37

+0

@BharatZala它應該已經有7年了,我不使用這個API。讓我知道你是否能夠使用此代碼。 – Max 2017-05-09 00:04:37

1

TranslatingXYDataset目前實現XYDataset;相反,您需要按照JFreeChart.createXYBarChart的要求實施IntervalXYDataset

+0

是的,你是對的。但仍然不工作:(當我實現IntervalXYDataset而不是XYDataset時,我必須編寫其他一些方法,例如: @Override public double getStartXValue(int series,int item){ return underlying.getStartXValue(series,item) ; } @覆蓋 公共雙getEndXValue(INT系列,詮釋項){ 回報underlying.getEndXValue(系列,項目);} 我不知道我應該對這些方法的身體做什麼額外的修改。 – Max 2010-07-13 02:12:20

+0

@Max:它看起來像'JFreeChart.createXYBarChart','XYBarRenderer'的默認渲染器不是很開心.'setShadowVisible(false)'help? – trashgod 2010-07-13 03:09:38

1

謝謝trashgod:D但我放棄了這種方法。我需要在這裏完成一些工作;)因此,爲了在圖上導航,我使用了不同的數據集org.jfree.data.time.DynamicTimeSeriesCollection

本課程針對實時應用程序,我們可以在其中添加新數據並以最快的方式丟棄最早的數據(取決於您的輸入數據)。總之,每次有人滾動條時,我只需要更改我的底層數據集,然後觸發一個PlotChangeEvent,然後將其傳遞到圖表並導致ChartChangeEvent被觸發。

這一系列事件用於確保在對圖表的任何組件進行更改時自動更新圖表。

再一次非常感謝你

+0

看起來像一個合理的選擇,比演示更清潔; +1。順便說一句,你需要使用'@'標籤給任何人,但你看到一個響應。 – trashgod 2010-07-15 01:48:48

+0

@trashgod:我找到了一個新的選擇,看到你。 – Max 2010-07-16 22:55:41