请教jfreechart的两个问题

如下图:
[img]http://bbs.5d.cn/uploadFiles/2009-08/QE07C9ZGK8M5.jpg[/img]
1.我想把图例显示在图的左上角部分.
2.柱形图其实是由三部分组,支店总的改的,正常营收,额外营收(普通情况只有两部分,总的及实际的),这种柱形图怎么做,谢谢!!
3.另外要把图显示在jsp中,只有先生成图片,然后再显示吗?有没有更好的方法,能在jsp中传参数然后自动刷新显示.
谢谢!!!
[b]问题补充:[/b]
谢谢walsh
另再请教一下,必须是struts2和jfreechart整合之后才能用这种简单的实现方法,因为项目不是很大,所以不想使用struts框架之类的,想用直接jsp开发,嘿~

第一个问题:[color=red]图例显示在左上角是做不到的[/color]。可以显示在上,下,左,右。

因为在API中只能设置这几个位置,相信楼主这个问题应该来说不是最重要的吧。

第二个问题:

[code="java"]public JFreeChart createStackedBarChart() {
double[][] data = new double[][] { { 10, 8, 12, 10, 40 },
{ 18, 12, 20, 10, 60 } };
String[] rowKeys = { "营收", "额外" };
String[] columnKeys = { "分店A", "分店B", "分店C", "分店D", "总店" };
CategoryDataset dataset = getBarData(data, rowKeys, columnKeys);

    // 2:JFreeChart对象
    JFreeChart chart = ChartFactory.createStackedBarChart("营业图", // 图表标题
            "", // 目录轴的显示标签
            "", // 数值轴的显示标签
            dataset, // 数据集
            PlotOrientation.VERTICAL, // 图表方向:水平、垂直
            true, // 是否显示图例(对于简单的柱状图必须是false)
            false, // 是否生成工具
            false // 是否生成URL链接
            );
    chart.setTextAntiAlias(false);
    chart.setBackgroundPaint(Color.WHITE);
    chart.setTitle(new TextTitle("营业图", new Font("隶书", Font.BOLD, 25)));
    Font labelFont = new Font("SansSerif", Font.TRUETYPE_FONT, 12);
    // 2 .3 Plot 对象 Plot 对象是图形的绘制结构对象
    CategoryPlot plot = chart.getCategoryPlot();
    plot.setRangeGridlinesVisible(true);
    plot.setRangeGridlinePaint(Color.gray);
    NumberAxis vn = (NumberAxis) plot.getRangeAxis();
    vn.setUpperBound(200);
    DecimalFormat df = new DecimalFormat("000");
    vn.setNumberFormatOverride(df); // 数据轴数据标签的显示格式
    // DomainAxis (区域轴,相当于 x 轴), RangeAxis (范围轴,相当于 y 轴)
    CategoryAxis domainAxis = plot.getDomainAxis();
    domainAxis.setLabelFont(labelFont);// 轴标题
    domainAxis.setTickLabelFont(labelFont);// 轴数值
        domainAxis.setMaximumCategoryLabelWidthRatio(0.6f);
    plot.setDomainAxis(domainAxis);
    // y轴设置
    ValueAxis rangeAxis = plot.getRangeAxis();
    rangeAxis.setLabelFont(labelFont);
    rangeAxis.setTickLabelFont(labelFont);
    // 设置最高的一个 Item 与图片顶端的距离
    rangeAxis.setUpperMargin(0.15);
    // 设置最低的一个 Item 与图片底端的距离
    rangeAxis.setLowerMargin(0.15);
    plot.setRangeAxis(rangeAxis);

    // Renderer 对象是图形的绘制单元
    StackedBarRenderer renderer = new StackedBarRenderer();
    // 设置柱子宽度
    renderer.setMaximumBarWidth(0.05);
    // 设置柱子高度
    renderer.setMinimumBarLength(0.1);
    // 设置柱的边框颜色
    renderer.setBaseOutlinePaint(Color.BLACK);
    // 设置柱的边框可见
    renderer.setDrawBarOutline(true);

    renderer.setSeriesPaint(0, new Color(204, 255, 204));
    renderer.setSeriesPaint(1, new Color(255, 204, 153));

    renderer.setItemMargin(0.4);

    renderer
            .setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
    renderer.setBaseItemLabelsVisible(true);

    plot.setRenderer(renderer);
    return chart;
}[/code]

运行结果如下图所示:
[url]http://walsh.iteye.com/upload/attachment/138372/445c54ac-5c1c-3be3-b3d7-aacdac1aee3f.png[/url]

第三个问题:

当然有更好的办法了,上图实现的就是在JSP中显示的,并且可以自动刷新,从而显示最新的数据信息。用struts2和jfreechart可以很容易就实现了。不会生成任何中间图片文件。

看它的收费文档

这里有下载
http://ari.iteye.com/blog/290094

当然了,上面的可能看起来不太漂亮,但是你可以进一步美化的。

如果用JSP,那就更简单了,只需要一个JSP文件就可实现(五秒钟自动刷新一次,你可以修改)。
[code="jsp"]<%@ page language="java" pageEncoding="UTF-8"%>
<%@ page import="java.awt.*"%>
<%@ page import="java.text.*"%>
<%@ page import="org.jfree.chart.*"%>
<%@ page import="org.jfree.chart.axis.*"%>
<%@ page import="org.jfree.chart.plot.*"%>
<%@ page import="org.jfree.chart.title.*"%>
<%@ page import="org.jfree.chart.servlet.ServletUtilities"%>
<%@ page
import="org.jfree.chart.labels.StandardCategoryItemLabelGenerator"%>
<%@ page import="org.jfree.chart.entity.StandardEntityCollection"%>
<%@ page import="org.jfree.chart.renderer.category.StackedBarRenderer"%>
<%@ page import="org.jfree.chart.title.TextTitle"%>
<%@ page import="org.jfree.data.category.CategoryDataset"%>
<%@ page import="org.jfree.data.general.DatasetUtilities"%>
<%@ page import="java.io.*"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">


My JSP 'test.jsp' starting page








<%
double[][] data = new double[][] { { 20, 30, 25, 50, 125 },
{ 30, 50, 45, 64, 190 } };
String[] rowKeys = { "营收", "额外" };
String[] columnKeys = { "分店A", "分店B", "分店C", "分店D", "总店" };
CategoryDataset dataset = DatasetUtilities.createCategoryDataset(
rowKeys, columnKeys, data);
JFreeChart chart = ChartFactory.createStackedBarChart("营业图", // 图表标题
"", // 目录轴的显示标签
"", // 数值轴的显示标签
dataset, // 数据集
PlotOrientation.VERTICAL, // 图表方向:水平、垂直
true, // 是否显示图例(对于简单的柱状图必须是false)
false, // 是否生成工具
false // 是否生成URL链接
);
LegendTitle legend = chart.getLegend(0);
legend.setItemFont(new Font("宋体", Font.BOLD, 14));
chart.setTextAntiAlias(false);
chart.setBackgroundPaint(Color.WHITE);
chart.setTitle(new TextTitle("营业图", new Font("隶书", Font.BOLD, 25)));
Font labelFont = new Font("SansSerif", Font.TRUETYPE_FONT, 12);
CategoryPlot plot = chart.getCategoryPlot();
plot.setRangeGridlinesVisible(true);
plot.setRangeGridlinePaint(Color.gray);
NumberAxis vn = (NumberAxis) plot.getRangeAxis();
vn.setUpperBound(500);
DecimalFormat df = new DecimalFormat("000");
vn.setNumberFormatOverride(df); // 数据轴数据标签的显示格式
CategoryAxis domainAxis = plot.getDomainAxis();
domainAxis.setLabelFont(labelFont);// 轴标题
domainAxis.setTickLabelFont(labelFont);// 轴数值
domainAxis.setMaximumCategoryLabelWidthRatio(0.6f);// 横轴上的 Lable 是否完整显示
plot.setDomainAxis(domainAxis);
ValueAxis rangeAxis = plot.getRangeAxis();
rangeAxis.setLabelFont(labelFont);
rangeAxis.setTickLabelFont(labelFont);
rangeAxis.setUpperMargin(0.15);
rangeAxis.setLowerMargin(0.15);
plot.setRangeAxis(rangeAxis);
StackedBarRenderer renderer = new StackedBarRenderer();
renderer.setMaximumBarWidth(0.1);
renderer.setMinimumBarLength(0.1);
renderer.setBaseOutlinePaint(Color.BLACK);
renderer.setDrawBarOutline(true);
renderer.setSeriesPaint(0, new Color(255, 102, 102));
renderer.setSeriesPaint(1, new Color(51, 153, 51));
renderer.setItemMargin(0.4);
renderer
.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
renderer.setBaseItemLabelsVisible(true);
plot.setRenderer(renderer);
StandardEntityCollection sec = new StandardEntityCollection();
ChartRenderingInfo info = new ChartRenderingInfo(sec);
PrintWriter w = new PrintWriter(out);//输出MAP信息
//700是图片长度,500是图片高度
String filename = ServletUtilities.saveChartAsJPEG(chart, 700, 500,
info, session);
ChartUtilities.writeImageMap(w, "map0", info, false);
String graphURL = request.getContextPath()
+ "/DisplayChart?filename=" + filename;
%>


xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

index.jsp


DisplayChart

org.jfree.chart.servlet.DisplayChart



DisplayChart
/DisplayChart

[/code]

不用做任何修改,启动服务器后,即可运行!