java JfreeChart:水平滚动 XYBarChart -(图表翻译和导航)
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/3231840/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
JfreeChart: Scroll XYBarChart Horizontally - (chart translation and navigation)
提问by Max
I am trying to scroll my XYBarChart horizontally, I am following one of the JfreeChart's Demo "TranslateDemo1.java" in which the source code you can find here:
我正在尝试水平滚动我的 XYBarChart,我正在关注 JfreeChart 的演示“TranslateDemo1.java”之一,您可以在其中找到源代码:
The source code works fine for a "TimeSeriesChart".
源代码适用于“TimeSeriesChart”。
However I tried with "XYBarChart" and WHEN I SLIDE THE BAR the behavior is not the same.
但是,我尝试使用“XYBarChart”,当我滑动条形图时,行为不一样。
Just to be clear I replaced the line #157 with the following source code:
为了清楚起见,我用以下源代码替换了 #157 行:
JFreeChart chart1= ChartFactory.createXYBarChart(
"Title",
null,
true,
"Ylabel",
xyDatasetTranslating,
PlotOrientation.VERTICAL,
true,
true,
false);
Does anyone know why the application is behaving in this way? and how I could possibly fix it.
有谁知道为什么应用程序会以这种方式运行?以及我如何修复它。
Thanks,
谢谢,
回答by Max
Here is a source code that implement a simple solution.
这是一个实现简单解决方案的源代码。
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);
}
}
回答by trashgod
TranslatingXYDatasetpresently implements XYDataset; instead, you'll need to implement IntervalXYDataset, as required by JFreeChart.createXYBarChart.
TranslatingXYDataset目前实施XYDataset;相反,您IntervalXYDataset需要根据JFreeChart.createXYBarChart.
回答by Max
Thanks trashgod:D But I gave up on this approach. I need to get some work done over here ;) So in order to navigate on the graph I used a different dataset org.jfree.data.time.DynamicTimeSeriesCollection.
谢谢垃圾神:D 但我放弃了这种方法。我需要在这里完成一些工作;) 所以为了在图表上导航,我使用了不同的数据集org.jfree.data.time.DynamicTimeSeriesCollection。
This class is aimed for real-time applications in which we have the ability to append new data and discard the oldest in a pretty fast way (depend on your input data). In summary, every time that someone scroll the bar I just need to change my underlying dataset, and that will fire a PlotChangeEventwhich, in turn, gets passed on to the chart and results in a ChartChangeEventbeing fired.
此类针对实时应用程序,在这些应用程序中,我们能够以非常快的方式添加新数据并丢弃最旧的数据(取决于您的输入数据)。总而言之,每次有人滚动条时,我只需要更改我的基础数据集,这将触发 a PlotChangeEvent,然后将其传递到图表并导致ChartChangeEvent被触发。
This chain of events is used to ensure that charts are automatically updated whenever a change is made to any component of the chart.
此事件链用于确保在对图表的任何组件进行更改时自动更新图表。
Once again, thank you very much
再次非常感谢


