import java.awt.Graphics
import java.awt.Image
import java.awt.Point
import java.awt.image.BufferedImage
import javax.swing.JFrame
public class t3 extends JFrame {
t3()
{
this.setSize(200, 200)
this.setDefaultCloseOperation(3)
this.setVisible(true)
}
public static void main(String[] args)throws Exception{
new t3()
}
Point[] p = new Point[]{new Point(1,1),new Point(11,31),new Point(31,21),new Point(99,100)}
public void paint(Graphics g)
{
Image img = (Image)new BufferedImage(200,200,BufferedImage.SCALE_DEFAULT)
Graphics gg = img.getGraphics()
for(int i=0i<p.length-1i++)
{
gg.drawLine(p[i].x, 200-p[i].y,p[i+1].x, 200-p[i+1].y)
}
g.drawImage(img, 0, 0, null)
}
}
jsp生成柱状图,饼状图,折线图可以借助于jfreechart。
1、柱状图的生成源码:
/**
* 生产柱状图
* @version 1.0
* @since
*/
@SuppressWarnings("serial")
public class PillarServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html")
// 使用普通数据集
DefaultCategoryDataset chartDate = new DefaultCategoryDataset()
// 增加测试数据,第一个参数是访问量,最后一个是时间,中间是显示用不考虑
chartDate.addValue(55, "访问量", "2010-01")
chartDate.addValue(65, "访问量", "2010-02")
chartDate.addValue(59, "访问量", "2010-03")
chartDate.addValue(156, "访问量", "2010-04")
chartDate.addValue(452, "访问量", "2010-05")
chartDate.addValue(359, "访问量", "2010-06")
try {
// 从数据库中获得数据集
DefaultCategoryDataset data = chartDate
// 使用ChartFactory创建3D柱状图,不想使用3D,直接使用createBarChart
JFreeChart chart = ChartFactory.createBarChart3D(
"网站月访问量统计", // 图表标题
"时间", // 目录轴的显示标签
"访问量", // 数值轴的显示标签
data, // 数据集
PlotOrientation.VERTICAL, // 图表方向,此处为垂直方向
// PlotOrientation.HORIZONTAL, //图表方向,此处为水平方向
true, // 是否显示图例
true, // 是否生成工具
false // 是否生成URL链接
)
// 设置整个图片的背景色
chart.setBackgroundPaint(Color.PINK)
// 设置图片有边框
chart.setBorderVisible(true)
Font kfont = new Font("宋体", Font.PLAIN, 12) // 底部
Font titleFont = new Font("宋体", Font.BOLD, 25) // 图片标题
// 图片标题
chart.setTitle(new TextTitle(chart.getTitle().getText(), titleFont))
// 底部
chart.getLegend().setItemFont(kfont)
// 得到坐标设置字体解决乱码
CategoryPlot categoryplot = (CategoryPlot) chart.getPlot()
categoryplot.setDomainGridlinesVisible(true)
categoryplot.setRangeCrosshairVisible(true)
categoryplot.setRangeCrosshairPaint(Color.blue)
NumberAxis numberaxis = (NumberAxis) categoryplot.getRangeAxis()
numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits())
BarRenderer barrenderer = (BarRenderer) categoryplot.getRenderer()
barrenderer.setBaseItemLabelFont(new Font("宋体", Font.PLAIN, 12))
barrenderer.setSeriesItemLabelFont(1, new Font("宋体", Font.PLAIN, 12))
CategoryAxis domainAxis = categoryplot.getDomainAxis()
/*------设置X轴坐标上的文字-----------*/
domainAxis.setTickLabelFont(new Font("sans-serif", Font.PLAIN, 11))
/*------设置X轴的标题文字------------*/
domainAxis.setLabelFont(new Font("宋体", Font.PLAIN, 12))
/*------设置Y轴坐标上的文字-----------*/
numberaxis.setTickLabelFont(new Font("sans-serif", Font.PLAIN, 12))
/*------设置Y轴的标题文字------------*/
numberaxis.setLabelFont(new Font("宋体", Font.PLAIN, 12))
/*------这句代码解决了底部汉字乱码的问题-----------*/
chart.getLegend().setItemFont(new Font("宋体", Font.PLAIN, 12))
// 生成图片并输出
ChartUtilities.writeChartAsJPEG(response.getOutputStream(), 1.0f,
chart, 500, 300, null)
} catch (Exception e) {
e.printStackTrace()
}
}
}
2、生成饼状统计图:
/**
* 生成饼状统计图
* @version 1.0
* @since
*/
@SuppressWarnings("serial")
public class CakeServlet extends HttpServlet {
protected void service(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html")
// 默认数据类型
DefaultPieDataset dataType = new DefaultPieDataset()
// 数据参数 内容,数量
dataType.setValue("IE6", 156)
dataType.setValue("IE7", 230)
dataType.setValue("IE8", 45)
dataType.setValue("火狐", 640)
dataType.setValue("谷歌", 245)
try {
DefaultPieDataset data = dataType
// 生成普通饼状图除掉 3D 即可
// 生产3D饼状图
PiePlot3D plot = new PiePlot3D(data)
JFreeChart chart = new JFreeChart(
"用户使用的浏览器类型", // 图形标题
JFreeChart.DEFAULT_TITLE_FONT, // 标题字体
plot, // 图标标题对象
true // 是否显示图例
)
// 设置整个图片的背景色
chart.setBackgroundPaint(Color.PINK)
// 设置图片有边框
chart.setBorderVisible(true)
// 配置字体
Font kfont = new Font("宋体", Font.PLAIN, 12) // 底部
Font titleFont = new Font("宋体", Font.BOLD, 25) // 图片标题
// 图片标题
chart.setTitle(new TextTitle(chart.getTitle().getText(), titleFont))
// 底部
chart.getLegend().setItemFont(kfont)
ChartUtilities.writeChartAsJPEG(response.getOutputStream(), 1.0f,
chart, 500, 300, null)
} catch (Exception e) {
e.printStackTrace()
}
}
}
3、柱状分布统计图:
/**
* 柱状分布统计图
* @version 1.0
* @since
*/
@SuppressWarnings("serial")
public class ParagraphsServlet extends HttpServlet {
protected void service(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html")
DefaultCategoryDataset dataTime = new DefaultCategoryDataset()
// 这是一组数据
dataTime.addValue(52, "0-6", "2010-1-1")
dataTime.addValue(86, "6-12", "2010-1-1")
dataTime.addValue(126, "12-18", "2010-1-1")
dataTime.addValue(42, "18-24", "2010-1-1")
// 这是一组数据
dataTime.addValue(452, "0-6", "2010-1-2")
dataTime.addValue(96, "6-12", "2010-1-2")
dataTime.addValue(254, "12-18", "2010-1-2")
dataTime.addValue(126, "18-24", "2010-1-2")
// 这是一组数据
dataTime.addValue(256, "0-6", "2010-1-3")
dataTime.addValue(86, "6-12", "2010-1-3")
dataTime.addValue(365, "12-18", "2010-1-3")
dataTime.addValue(24, "18-24", "2010-1-3")
try {
DefaultCategoryDataset data = dataTime
// 使用ChartFactory创建3D柱状图,不想使用3D,直接使用createBarChart
JFreeChart chart = ChartFactory.createBarChart3D(
"网站时间段访问量统计",
"时间",
"访问量",
data,
PlotOrientation.VERTICAL,
true,
false,
false
)
// 设置整个图片的背景色
chart.setBackgroundPaint(Color.PINK)
// 设置图片有边框
chart.setBorderVisible(true)
Font kfont = new Font("宋体", Font.PLAIN, 12) // 底部
Font titleFont = new Font("宋体", Font.BOLD, 25) // 图片标题
// 图片标题
chart.setTitle(new TextTitle(chart.getTitle().getText(), titleFont))
// 底部
chart.getLegend().setItemFont(kfont)
// 得到坐标设置字体解决乱码
CategoryPlot categoryplot = (CategoryPlot) chart.getPlot()
categoryplot.setDomainGridlinesVisible(true)
categoryplot.setRangeCrosshairVisible(true)
categoryplot.setRangeCrosshairPaint(Color.blue)
NumberAxis numberaxis = (NumberAxis) categoryplot.getRangeAxis()
numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits())
BarRenderer barrenderer = (BarRenderer) categoryplot.getRenderer()
barrenderer.setBaseItemLabelFont(new Font("宋体", Font.PLAIN, 12))
barrenderer.setSeriesItemLabelFont(1, new Font("宋体", Font.PLAIN, 12))
CategoryAxis domainAxis = categoryplot.getDomainAxis()
/*------设置X轴坐标上的文字-----------*/
domainAxis.setTickLabelFont(new Font("sans-serif", Font.PLAIN, 11))
/*------设置X轴的标题文字------------*/
domainAxis.setLabelFont(new Font("宋体", Font.PLAIN, 12))
/*------设置Y轴坐标上的文字-----------*/
numberaxis.setTickLabelFont(new Font("sans-serif", Font.PLAIN, 12))
/*------设置Y轴的标题文字------------*/
numberaxis.setLabelFont(new Font("宋体", Font.PLAIN, 12))
/*------这句代码解决了底部汉字乱码的问题-----------*/
chart.getLegend().setItemFont(new Font("宋体", Font.PLAIN, 12))
ChartUtilities.writeChartAsJPEG(response.getOutputStream(), 1.0f,
chart, 500, 300, null)
} catch (Exception es) {
es.printStackTrace()
}
}
}
简单的可以用java.awt.geom java.awt.image 这两个包// 清空缓冲区
response.reset()
// 注意这里的MIME类型
response.setContentType("image/png")
// 创建一个 610X400 的图像
int width = 610, height = 400
BufferedImage image = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB)
// 创建Java2D对象
/**
Graphics g = image.getGraphics()
Graphics2D g2d = (Graphics2D)g
*/
Graphics2D g2d = image.createGraphics()
// 填充背景
g2d.setColor(Color.WHITE)
g2d.fillRect(0, 0, width, height)
// 绘制新背景
GradientPaint grayGP = new GradientPaint(0, 0, Color.GRAY, width, height,
new Color(200, 200, 200), false)
g2d.setPaint(grayGP)
g2d.fillRoundRect(20, 20, width - 20, height - 20, 50, 50)
g2d.setPaint(Color.WHITE)
g2d.fillRoundRect(12, 12, width - 20, height - 20, 50, 50)
BasicStroke bs = new BasicStroke(4.0f)
g2d.setStroke(bs)
g2d.setPaint(new Color(53, 76, 112))
g2d.drawRoundRect(12, 12, width - 20, height - 20, 50, 50)
GradientPaint blueGP = new GradientPaint(120, 60, new Color(215, 230, 252),
120, 300, Color.WHITE, false)
g2d.setPaint(blueGP)
g2d.fillRect(120, 60, 440, 300)
// 绘制图表标题
String chartTitle = "计算机编程类图书2004年月销售量统计图"
g2d.setFont(new Font("方正粗宋简体", Font.PLAIN, 22))
g2d.setColor(Color.BLACK)
g2d.drawString(chartTitle, 140, 40)
// 创建虚线笔划
float[]dashes = { 3.f }
bs = new BasicStroke(1.0f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND,
10, dashes, 0)
g2d.setStroke(bs)
g2d.setFont(new Font("Courier New", Font.PLAIN, 12))
String str = "2004-"
int stringLength = 0
for (int i = 1i <= 12i++)
{
// 绘制垂直方向虚线
g2d.drawLine(80+i * 40, 50, 80+i * 40, 360)
// 绘制横轴上月份的说明文字
str += i
stringLength = g2d.getFontMetrics().stringWidth(str)
if (i % 2 == 0)
{
g2d.drawString(str, 80+i * 40 - stringLength / 2, 387)
}
else
{
g2d.drawString(str, 80+i * 40 - stringLength / 2, 375)
}
str = "2004-"
}
str = ""
int stringHeight = 0
for (int i = 0i <300i += 30)
{
// 绘制水平方向虚线
g2d.drawLine(120, 60+i, 570, 60+i)
// 绘制纵轴上销售量的说明文字
str += 100-i / 3
stringHeight = g2d.getFontMetrics().getAscent()
stringLength = g2d.getFontMetrics().stringWidth(str)
g2d.drawString(str, 110-stringLength, 60+i + stringHeight / 2)
str = ""
}
// 绘制坐标轴
g2d.setStroke(new BasicStroke(3.0f))
g2d.setColor(new Color(53, 76, 112))
g2d.drawLine(120, 50, 120, 360)
g2d.drawLine(120, 360, 570, 360)
// 绘制纵坐标上的标题
g2d.setFont(new Font("黑体", Font.PLAIN, 15))
g2d.drawString("月销售量", 40, 45)
// 调用TriangleServlet类,绘制坐标轴上的箭头
TriangleServlet ts = new TriangleServlet()
ts.setFillColor(new Color(53, 76, 112))
ts.setBaseLine(10)
ts.setAlpha(60)
ts.drawTrigangle(570, 360, 2, 2, g2d)// 绘制横坐标轴上的箭头
ts.drawTrigangle(120, 50, 1, 2, g2d)// 绘制纵坐标轴上的箭头
String[] bookTitle = { "JAVA", "C#" }
Color[] bookColor = { Color.RED, Color.ORANGE }
int[] sales = new int[12]
int[] month = new int[12]
g2d.setFont(new Font("Courier New", Font.PLAIN, 12))
for (int i = 0i <bookTitle.lengthi++)
{
// 初始化绘制数据
int bookSales = 0
for (int j = 0j <sales.lengthj++)
{
bookSales = 45+(int)(Math.random() * 50)
sales[j] = 360-bookSales * 3
month[j] = 120+j * 40
}
// 重新设置笔划
g2d.setStroke(new BasicStroke(5.0f))
g2d.setColor(bookColor[i])
// 绘制月销售量折线
g2d.drawPolyline(month, sales, sales.length)
// 绘制图例
g2d.fillRect(30, 140+i * 20, 10, 10)
g2d.setColor(Color.BLACK)
g2d.drawString(bookTitle[i], 45, 150+i * 20)
}
// 部署图形
g2d.dispose()
// 利用ImageIO类的write方法对图像进行编码
ServletOutputStream sos = response.getOutputStream()
ImageIO.write(image, "PNG", sos)
sos.close()
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)