我想用JFreeChart实现如下图的效果
但是  我根据网上别人的代码  编写却总是包错  请高手帮帮忙。
我的代码如下public class bloodSugarChart extends ApplicationFrame {
//构造函数
public bloodSugarChart(String s) {  
super(s);
setContentPane(createDemoLine());
}
   //测试类
public static void main(String[] args) {
bloodSugarChart bloodSugar = new bloodSugarChart("血糖折线图");
bloodSugar.pack();
RefineryUtilities.centerFrameOnScreen(bloodSugar);
bloodSugar.setVisible(true); } // 生成显示图表的面板
public static JPanel createDemoLine() {
JFreeChart jfreechart = createChart(createDataset());
return new ChartPanel(jfreechart);
} // 生成图表主对象JFreeChart
public static JFreeChart createChart(DefaultCategoryDataset linedataset) {
// 定义图表对象
JFreeChart chart = ChartFactory.createLineChart("病人半个月的血糖值显示图", // chart title
"采集时间", // domain axis label
"血糖指标值", // range axis label
linedataset, // data
PlotOrientation.VERTICAL, // orientation
true, // include legend
true, // tooltips
false // urls
); // CategoryPlot plot = chart.getCategoryPlot();  //生成图形
XYPlot plot = (XYPlot) chart.getPlot();
//图像属性部分
plot.setBackgroundPaint(Color.white);
plot.setDomainGridlinePaint(Color.BLACK);
plot.setDomainGridlinesVisible(true);
plot.setRangeGridlinePaint(Color.GRAY);
//数据属性部分
NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis();
rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
rangeAxis.setAutoRangeIncludesZero(true);
rangeAxis.setUpperMargin(0.20);
rangeAxis.setLabelAngle(Math.PI / 2.0);
rangeAxis.setAutoRange(false);



XYLineAndShapeRenderer xylineandshaperenderer = (XYLineAndShapeRenderer)plot.getRenderer();
//设置网格背景颜色
plot.setBackgroundPaint(Color.white);
//设置网格竖线颜色
plot.setDomainGridlinePaint(Color.pink);
//设置网格横线颜色
plot.setRangeGridlinePaint(Color.pink);
//设置曲线图与xy轴的距离
plot.setAxisOffset(new RectangleInsets(0D, 0D, 0D, 10D));
//设置曲线是否显示数据点
xylineandshaperenderer.setBaseShapesVisible(true);
//设置曲线显示各数据点的值
XYItemRenderer xyitem = plot.getRenderer();   
xyitem.setBaseItemLabelsVisible(true);   
xyitem.setBasePositiveItemLabelPosition(new ItemLabelPosition(ItemLabelAnchor.OUTSIDE12, TextAnchor.BASELINE_LEFT));
xyitem.setBaseItemLabelGenerator(new StandardXYItemLabelGenerator());
xyitem.setBaseItemLabelFont(new Font("Dialog", 1, 14));
plot.setRenderer(xyitem);
LineAndShapeRenderer renderer = (LineAndShapeRenderer) plot
.getRenderer();
renderer.setBaseItemLabelsVisible(true);
renderer.setBaseItemLabelsVisible(true);
renderer.setBaseShapesFilled(true);


return chart;
} // 生成数据
public static DefaultCategoryDataset createDataset() {
DefaultCategoryDataset linedataset = new DefaultCategoryDataset();
// 各曲线名称
String series1 = "血糖值"; // 横轴名称(列名称)
String[] time = new String[15];
String[] timeValue = { "6-1日", "6-2日", "6-3日", "6-4日", "6-5日", "6-6日",
"6-7日", "6-8日", "6-9日", "6-10日", "6-11日", "6-12日", "6-13日",
"6-14日", "6-15日" };
for (int i = 0; i < 15; i++) {
time[i] = timeValue[i];
} for (int i = 0; i < 15; i++) {
Random r = new Random();
linedataset.addValue(i + i * 9.34 + r.nextLong() % 100, series1,
time[i]);
} return linedataset;
}}

解决方案 »

  1.   

    错误提示如下Exception in thread "main" java.lang.ClassCastException: org.jfree.chart.plot.CategoryPlot cannot be cast to org.jfree.chart.plot.XYPlot
    at com.dy.lt.work.bloodSugarChart.createChart(bloodSugarChart.java:71)
    at com.dy.lt.work.bloodSugarChart.createDemoLine(bloodSugarChart.java:53)
    at com.dy.lt.work.bloodSugarChart.<init>(bloodSugarChart.java:40)
    at com.dy.lt.work.bloodSugarChart.main(bloodSugarChart.java:44)
    主要就是下面这段代码啦 XYLineAndShapeRenderer xylineandshaperenderer = (XYLineAndShapeRenderer)plot.getRenderer();
            //设置网格背景颜色
            plot.setBackgroundPaint(Color.white);
            //设置网格竖线颜色
            plot.setDomainGridlinePaint(Color.pink);
            //设置网格横线颜色
            plot.setRangeGridlinePaint(Color.pink);
            //设置曲线图与xy轴的距离
            plot.setAxisOffset(new RectangleInsets(0D, 0D, 0D, 10D));
            //设置曲线是否显示数据点
            xylineandshaperenderer.setBaseShapesVisible(true);
            //设置曲线显示各数据点的值
            XYItemRenderer xyitem = plot.getRenderer();   
            xyitem.setBaseItemLabelsVisible(true);   
            xyitem.setBasePositiveItemLabelPosition(new ItemLabelPosition(ItemLabelAnchor.OUTSIDE12, TextAnchor.BASELINE_LEFT));
            xyitem.setBaseItemLabelGenerator(new StandardXYItemLabelGenerator());
            xyitem.setBaseItemLabelFont(new Font("Dialog", 1, 14));
            plot.setRenderer(xyitem);
      

  2.   

    看错误跟行数不就知道了吗?
    XYPlot plot = (XYPlot) chart.getPlot();
    org.jfree.chart.plot.CategoryPlot cannot be cast to org.jfree.chart.plot.XYPlot
    类型转化错误啊
      

  3.   


    CategoryPlot plot = chart.getCategoryPlot();
      

  4.   

    如果是这样的话 那个功能就没法实现了 也就是这段代码
    XYLineAndShapeRenderer xylineandshaperenderer = (XYLineAndShapeRenderer)plot.getRenderer();
            //设置网格背景颜色
            plot.setBackgroundPaint(Color.white);
            //设置网格竖线颜色
            plot.setDomainGridlinePaint(Color.pink);
            //设置网格横线颜色
            plot.setRangeGridlinePaint(Color.pink);
            //设置曲线图与xy轴的距离
            plot.setAxisOffset(new RectangleInsets(0D, 0D, 0D, 10D));
            //设置曲线是否显示数据点
            xylineandshaperenderer.setBaseShapesVisible(true);
            //设置曲线显示各数据点的值
            XYItemRenderer xyitem = plot.getRenderer();   
            xyitem.setBaseItemLabelsVisible(true);   
            xyitem.setBasePositiveItemLabelPosition(new ItemLabelPosition(ItemLabelAnchor.OUTSIDE12, TextAnchor.BASELINE_LEFT));
            xyitem.setBaseItemLabelGenerator(new StandardXYItemLabelGenerator());
            xyitem.setBaseItemLabelFont(new Font("Dialog", 1, 14));
            plot.setRenderer(xyitem);
     
    这段代码对应的必须是  XYPlot
      

  5.   

    一定要XYLineAndShapeRenderer吗
    LineAndShapeRenderer不行吗?
      

  6.   

    如果要用XYLineAndShapeRenderer
    则创建chart要用ChartFactory.createXYLineChart(title, xAxisLabel, yAxisLabel, dataset, orientation, legend, tooltips, urls);
      

  7.   

    总算把问题解决了!
    用的是CategoryPlot 
    那些关键语句部分如下
    // 数据渲染部分
    LineAndShapeRenderer renderer = (LineAndShapeRenderer) plot
    .getRenderer();
    renderer.setBaseItemLabelsVisible(true);
    renderer.setBaseShapesFilled(true);
    renderer.setBaseItemLabelsVisible(true);
    renderer.setBasePositiveItemLabelPosition(new ItemLabelPosition(
    ItemLabelAnchor.OUTSIDE12, TextAnchor.BASELINE_LEFT));
    renderer
    .setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
    renderer.setBaseItemLabelFont(new Font("Dialog", 1, 14));
    plot.setRenderer(renderer);贴出来分享下。
    最后谢谢给我帮助的人。。
      

  8.   

    呵呵  其实CategoryPlot也有这些控制方法!不然,这个插件就不会那么出名了!