用jsp编写折线图,数据来自数据库,这样的程序怎么写,谢谢

用jsp编写折线图,数据来自数据库,这样的程序怎么写,谢谢,第1张

用Graphics 画图,如下例子,当然你需要把里边的图片,弄出来放到页面,而不是用paint

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()


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/6716255.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-27
下一篇 2023-03-27

发表评论

登录后才能评论

评论列表(0条)

保存