Bar and Line Chart with Horizontal Scroll

A discussion forum for JFreeChart (a 2D chart library for the Java platform).
Locked
bxtz
Posts: 1
Joined: Sun Apr 05, 2015 7:56 am
antibot: No, of course not.

Bar and Line Chart with Horizontal Scroll

Post by bxtz » Sun Apr 05, 2015 9:23 am

Hi,
I'm trying to create a chart with bars and lines mixed with a horizontal scroll. Without the scroll, it works great, but when I try to use the SlidingCategoryDataset, just the bars move. So, I need a way to scroll both bars and line. Does anyone have any clue about how I can do it? This is the code I'm working on:

Code: Select all

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GradientPaint;
import javax.swing.BorderFactory;
import javax.swing.JPanel;
import javax.swing.JScrollBar;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.CategoryLabelPositions;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.labels.StandardCategoryToolTipGenerator;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.DatasetRenderingOrder;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.BarRenderer;
import org.jfree.chart.renderer.category.LineAndShapeRenderer;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.data.category.SlidingCategoryDataset;
import org.jfree.ui.ApplicationFrame;
import org.jfree.ui.RefineryUtilities;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JPanel;
import org.jfree.chart.JFreeChart;

class DemoPanel extends JPanel {

    private static final long serialVersionUID = 1L;
    List<JFreeChart> charts;

    public DemoPanel(java.awt.LayoutManager layoutmanager) {
        super(layoutmanager);
        charts = new ArrayList<JFreeChart>();
    }

    public void addChart(JFreeChart jfreechart) {
        charts.add(jfreechart);
    }

    public JFreeChart[] getCharts() {
        int i = charts.size();
        JFreeChart ajfreechart[] = new JFreeChart[i];
        for (int j = 0; j < i; j++)
            ajfreechart[j] = (JFreeChart) charts.get(j);

        return ajfreechart;
    }
}

public class SlidingCategoryDatasetDemo2 extends ApplicationFrame {
    private static final long serialVersionUID = 1L;

    static class MyDemoPanel extends DemoPanel implements ChangeListener {

        private static final long serialVersionUID = 1L;
        JScrollBar scroller;
        SlidingCategoryDataset dataset;

        private  CategoryDataset createDataset() {
            DefaultCategoryDataset dataset = new DefaultCategoryDataset();
            for (int i = 0; i < 50; i++)
                dataset.addValue(Math.random() * 100D, "S1", "S" + i);

            return dataset;
        }

        private static JFreeChart createChart(CategoryDataset dataset) {
            JFreeChart chart = ChartFactory.createBarChart("SlidingCategoryDatasetDemo2", "Series", "Value", dataset, PlotOrientation.VERTICAL, false, true, false);
            CategoryPlot plot = (CategoryPlot) chart.getPlot();
            CategoryAxis domainAxis = plot.getDomainAxis();
            domainAxis.setMaximumCategoryLabelWidthRatio(0.8F);
            domainAxis.setLowerMargin(0.02D);
            domainAxis.setUpperMargin(0.02D);
            NumberAxis valueAxis = (NumberAxis) plot.getRangeAxis();
            valueAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
            valueAxis.setRange(0.0D, 100D);//hxzon:when restoreAutoBounds,invalidation
            BarRenderer renderer = (BarRenderer) plot.getRenderer();
            renderer.setDrawBarOutline(false);
            GradientPaint gradientpaint = new GradientPaint(0.0F, 0.0F, Color.blue, 0.0F, 0.0F, new Color(0, 0, 64));
            renderer.setSeriesPaint(0, gradientpaint);
            return chart;
        }

        public void stateChanged(ChangeEvent changeevent) {
            //SlidingCategoryDataset
            dataset.setFirstCategoryIndex(scroller.getValue());
        }

        public MyDemoPanel() {
            super(new BorderLayout());
            dataset = new SlidingCategoryDataset(createDataset(), 0, 10);
            JFreeChart jfreechart = createChart(dataset);
            CategoryPlot categoryplot = (CategoryPlot) jfreechart.getPlot();
            SlidingCategoryDataset categorydataset = new SlidingCategoryDataset(createDataset(), 0, 10);
            
			categoryplot.setDataset(1, categorydataset);
			categoryplot.mapDatasetToRangeAxis( 1, 0);
			categoryplot.mapDatasetToDomainAxis(1, 0);
			LineAndShapeRenderer lineandshaperenderer = new LineAndShapeRenderer();
			lineandshaperenderer.setBaseToolTipGenerator(new StandardCategoryToolTipGenerator());
			categoryplot.setRenderer(1, lineandshaperenderer);
			
			CategoryAxis categoryaxis = categoryplot.getDomainAxis();
			categoryaxis.setCategoryLabelPositions(CategoryLabelPositions.DOWN_45);
			categoryplot.setDatasetRenderingOrder(DatasetRenderingOrder.FORWARD);
            addChart(jfreechart);
            ChartPanel chartpanel = new ChartPanel(jfreechart);
            chartpanel.setPreferredSize(new Dimension(400, 400));
            scroller = new JScrollBar(0, 0, 10, 0, 50);
            add(chartpanel);
            scroller.getModel().addChangeListener(this);
            JPanel jpanel = new JPanel(new BorderLayout());
            jpanel.add(scroller);
            jpanel.setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2));
            jpanel.setBackground(Color.white);
            add(jpanel, "South");
        }
    }

    public SlidingCategoryDatasetDemo2(String s) {
        super(s);
        setDefaultCloseOperation(3);
        setContentPane(createDemoPanel());
    }

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

    public static void main(String args[]) {
        SlidingCategoryDatasetDemo2 slidingcategorydatasetdemo2 = new SlidingCategoryDatasetDemo2("JFreeChart: SlidingCategoryDatasetDemo2.java");
        slidingcategorydatasetdemo2.pack();
        RefineryUtilities.centerFrameOnScreen(slidingcategorydatasetdemo2);
        slidingcategorydatasetdemo2.setVisible(true);
    }
}

paradoxoff
Posts: 1634
Joined: Sat Feb 17, 2007 1:51 pm

Re: Bar and Line Chart with Horizontal Scroll

Post by paradoxoff » Tue Apr 07, 2015 8:39 pm

In your MyDemoPanel class, ypu are creating two instances of SlidingCategoryDataset ("dataset" and "categorydataset"). The latter is drawn by a LineAndShapeRenderer.
In your stateChanged method, you are only calling the setFirstCategoryIndex-method on "dataset", not on "categorydataset". You need to change that.
I would also suggest to use more descriptive names for your variables, reduce the amount of "static" in your code, and extending classes when it is not needed.

Locked