JfreeChart:水平滚动XYBarChart – (图表翻译和导航)

我正在尝试水平滚动我的XYBarChart,我正在关注其中一个JfreeChart的演示“TranslateDemo1.java”,其中您可以在这里找到源代码:

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”,当我滑动BAR时行为不一样。

为了清楚起见,我用以下源代码替换了#157行:

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

有谁知道应用程序以这种方式表现的原因? 以及如何解决它。

谢谢,

这是一个实现简单解决方案的源代码。

TranslateDemo截图

 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 

TranslatingXYDataset目前实现了XYDataset ; 相反,您需要按照JFreeChart.createXYBarChart要求实现IntervalXYDataset

谢谢trashgod :D但我放弃了这种方法。 我需要在这里完成一些工作;)因此,为了在图表上导航,我使用了不同的数据集org.jfree.data.time.DynamicTimeSeriesCollection

本课程针对的是实时应用程序,在这些应用程序中,我们能够以非常快的方式附加新数据并丢弃最旧的数据(取决于您的输入数据)。 总之,每当有人滚动栏时我只需要更改我的基础数据集,这将触发PlotChangeEvent ,而PlotChangeEvent又被传递到图表并导致ChartChangeEvent被触发。

此事件链用于确保只要对图表的任何组件进行更改,图表就会自动更新。

再一次,非常感谢你