Java 带水平滚动条的动态JFreechart面积图

Java 带水平滚动条的动态JFreechart面积图,java,jfreechart,Java,Jfreechart,我有一个动态jfreechart区域图表,我想添加一个水平滚动条,显示图表中显示的旧值,因为我的图表仅显示计时器最后10秒的值。 如何做到这一点?我正在举一个例子 公共类essaijfree2扩展了ApplicationFrame{ 私有静态最终字符串TITLE=“动态系列”; 私有静态最终字符串START=“START”; 私有静态最终字符串STOP=“STOP”; 专用静态最终浮动最小值=100; 私有静态最终整数计数=2*60; 专用静态最终整数FAST=100; 专用静态最终整数慢=快*

我有一个动态jfreechart区域图表,我想添加一个水平滚动条,显示图表中显示的旧值,因为我的图表仅显示计时器最后10秒的值。 如何做到这一点?我正在举一个例子

公共类essaijfree2扩展了ApplicationFrame{
私有静态最终字符串TITLE=“动态系列”;
私有静态最终字符串START=“START”;
私有静态最终字符串STOP=“STOP”;
专用静态最终浮动最小值=100;
私有静态最终整数计数=2*60;
专用静态最终整数FAST=100;
专用静态最终整数慢=快*5;
私有静态最终随机=新随机();
私人定时器;
公共essaijfree2(最终字符串标题){
超级(标题);
最终DynamicMiseriesCollection数据集=
新的DynamicMiseriesCollection(1,COUNT,new Second());
setTimeBase(新秒(0,0,0,1,1,2011));
addSeries(Gaussianada(),0,“高斯数据”);
JFreeChart chart=createChart(数据集);
XYPlot XYPlot=(XYPlot)chart.getPlot();
xydifferencenderr=新的xydifferencender(Color.green,Color.red,true);
xyPlot.setRenderer(r);
最终JComboBox组合=新JComboBox();
combo.addItem(“快速”);
组合添加项(“慢”);
combo.addActionListener(新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件e){
if(“Fast”.equals(combo.getSelectedItem())){
定时器设置延迟(快速);
}否则{
定时器设置延迟(慢);
}
}
});
添加(新图表面板(图表),边框布局.CENTER);
JPanel btnPanel=newjpanel(newflowlayout());
btnPanel.add(组合);
添加(btnPanel,BorderLayout.SOUTH);
计时器=新计时器(快速,新ActionListener(){
浮动[]新数据=新浮动[1];
@凌驾
已执行的公共无效操作(操作事件e){
newData[0]=randomValue();
dataset.advanceTime();
dataset.appendData(新数据);
}
});
}
私有浮点值(){
返回(浮动)(random.nextGaussian()*MINMAX/3);
}
私有浮点[]高斯数(){
浮动[]a=新浮动[计数];
for(int i=0;i
在您指定要保留的数据点数量时,我认为您无法使用
DynamicMiseriesCollection
来实现这一点,在您的情况下
COUNT=2*60


您可以使用
timeseriescolection

,但是
timeseriescolection
不允许我只显示最后10秒,但它显示所有显示的值。问题在于,您希望添加一个滚动条来显示
系列的历史数据,限制为120条记录。在这种情况下,您将影响性能增加更多的数据。我会考虑添加一个第二个图表来显示历史数据。当我点击另一个图表的时候,我会在我的面板上加一个按钮。我试图做另一个图表,所有的数据都出现在旧图表的位置。我希望这是可能的。
public class essaijfree2 extends ApplicationFrame {

private static final String TITLE = "Dynamic Series";
private static final String START = "Start";
private static final String STOP = "Stop";
private static final float MINMAX = 100;
private static final int COUNT = 2 * 60;
private static final int FAST = 100;
private static final int SLOW = FAST * 5;
private static final Random random = new Random();
private Timer timer;

public essaijfree2(final String title) {
    super(title);
    final DynamicTimeSeriesCollection dataset =
        new DynamicTimeSeriesCollection(1, COUNT, new Second());
    dataset.setTimeBase(new Second(0, 0, 0, 1, 1, 2011));
    dataset.addSeries(gaussianData(), 0, "Gaussian data");
    JFreeChart chart = createChart(dataset);
    XYPlot xyPlot = (XYPlot) chart.getPlot();
    XYDifferenceRenderer r = new XYDifferenceRenderer(Color.green,Color.red, true);
    xyPlot.setRenderer(r);



    final JComboBox combo = new JComboBox();
    combo.addItem("Fast");
    combo.addItem("Slow");
    combo.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            if ("Fast".equals(combo.getSelectedItem())) {
                timer.setDelay(FAST);
            } else {
                timer.setDelay(SLOW);
            }
        }
    });

    this.add(new ChartPanel(chart), BorderLayout.CENTER);
    JPanel btnPanel = new JPanel(new FlowLayout());

    btnPanel.add(combo);
    this.add(btnPanel, BorderLayout.SOUTH);

    timer = new Timer(FAST, new ActionListener() {

        float[] newData = new float[1];

        @Override
        public void actionPerformed(ActionEvent e) {
            newData[0] = randomValue();
            dataset.advanceTime();
            dataset.appendData(newData);
        }
    });
}

private float randomValue() {

    return (float) (random.nextGaussian() * MINMAX / 3);
}

private float[] gaussianData() {
    float[] a = new float[COUNT];
    for (int i = 0; i < a.length; i++) {
        a[i] = randomValue();
    }
    return a;
}

private JFreeChart createChart(final XYDataset dataset) {
    final JFreeChart result = ChartFactory.createXYAreaChart(
        TITLE, "hh:mm:ss", "milliVolts", dataset,PlotOrientation.VERTICAL, true, true, false);
    final XYPlot plot = result.getXYPlot();
    ValueAxis domain = plot.getDomainAxis();
    domain.setAutoRange(true);

    ValueAxis range = plot.getRangeAxis();
    range.setRange(-MINMAX, MINMAX);
    return result;
}

public void start() {
    timer.start();
}

public static void main(final String[] args) {
    EventQueue.invokeLater(new Runnable() {

        @Override
        public void run() {
            essaijfree2 demo = new essaijfree2(TITLE);
            demo.pack();
            RefineryUtilities.centerFrameOnScreen(demo);
            demo.setVisible(true);
            demo.start();
        }
    });
}