我想向图表添加滚动条,以便查看不适合屏幕显示的大数据集,因为保留所有xtick。但是,我收到以下错误消息:

Exception in thread "main" java.lang.ClassCastException: org.jfree.data.xy.XYSeriesCollection cannot be cast to org.jfree.data.category.CategoryDataset
    at MySlidingCategoryDatasetDemo3$DemoPanel.<init>(MySlidingCategoryDatasetDemo3.java:86)
    at MySlidingCategoryDatasetDemo3.createDemoPanel(MySlidingCategoryDatasetDemo3.java:112)
    at MySlidingCategoryDatasetDemo3.<init>(MySlidingCategoryDatasetDemo3.java:107)
    at MySlidingCategoryDatasetDemo3.main(MySlidingCategoryDatasetDemo3.java:117)


使用以下代码:

import java.awt.*;
import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import org.jfree.data.category.*;
import org.jfree.chart.*;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.StandardXYItemRenderer;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.data.category.*;
import org.jfree.data.xy.XYDataset;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;
import org.jfree.ui.ApplicationFrame;
import org.jfree.ui.RefineryUtilities;

public class MySlidingCategoryDatasetDemo3 extends ApplicationFrame
{
    static class DemoPanel extends JPanel
        implements ChangeListener
    {
        private static XYDataset createDataset()
        {
            XYSeries xyseries = new XYSeries("First");
            xyseries.add(1.0D, 1.0D);
            xyseries.add(2D, 4D);
            xyseries.add(3D, 3D);
            xyseries.add(4D, 5D);
            xyseries.add(5D, 5D);
            xyseries.add(6D, 7D);
            xyseries.add(7D, 7D);
            xyseries.add(8D, 8D);
            xyseries.add(9D, 8D);
            xyseries.add(10D, 8D);
            xyseries.add(11D, 8D);
            xyseries.add(12D, 8D);
            xyseries.add(13D, 8D);
            xyseries.add(14D, 8D);
            xyseries.add(15D, 8D);
            xyseries.add(16D, 25D);
            xyseries.add(17D, 8D);
            xyseries.add(18D, 5D);
            xyseries.add(19D, 7D);
            xyseries.add(20D, 6D);
            xyseries.add(21D, 8D);
            xyseries.add(22D, 4D);
            xyseries.add(23D, 4D);
            xyseries.add(24D, 2D);
            xyseries.add(25D, 1.0D);

            XYSeriesCollection xyseriescollection = new XYSeriesCollection();
            xyseriescollection.addSeries(xyseries);

            return xyseriescollection;
        }

        private static JFreeChart createChart(XYDataset xydataset)
        {
            JFreeChart jfreechart = ChartFactory.createXYLineChart("Line Chart Demo 2", "X", "Y", xydataset, PlotOrientation.VERTICAL, true, true, false);
            XYPlot xyplot = (XYPlot)jfreechart.getPlot();
            xyplot.setDomainPannable(true);
            xyplot.setRangePannable(true);

            StandardXYItemRenderer xylineandshaperenderer = (StandardXYItemRenderer)xyplot.getRenderer();
            xylineandshaperenderer.setBaseShapesVisible(true);
            xylineandshaperenderer.setBaseShapesFilled(true);
            NumberAxis numberaxis = (NumberAxis)xyplot.getRangeAxis();
            numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
            numberaxis.setRange(0.0D, 100D);
            return jfreechart;
        }

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

        JScrollBar scroller;
        SlidingCategoryDataset dataset;

        public DemoPanel()
        {
            super(new BorderLayout());
            dataset = new SlidingCategoryDataset((CategoryDataset) createDataset(), 0, 10);
            JFreeChart jfreechart = createChart((XYDataset) dataset);
            //JFreeChart jfreechart = createChart(createDataset());
            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 MySlidingCategoryDatasetDemo3(String s)
    {
        super(s);
        setDefaultCloseOperation(3);
        setContentPane(createDemoPanel());
    }

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

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


我做错什么了?

先感谢您。

最佳答案

错误消息非常明显:


org.jfree.data.xy.XYSeriesCollection无法转换为org.jfree.data.category.CategoryDataset


您正在将XYSeriesCollection对象强制转换为CategoryDataset对象,这是行不通的。查看堆栈跟踪中的行,这是由以下行引起的

dataset = new SlidingCategoryDataset((CategoryDataset) createDataset(), 0, 10);


createDataset()方法返回一个XYSeriesCollection而不是一个CategoryDataset,因此您不能执行此强制转换。要么调整该方法的返回类型,要么摆脱强制转换

10-06 07:01