转载自:http://www.xrss.cn/Dev/JAVA/200792816836.Html

实现非常简单,例子主要有3个类,ImageContainer.java 在内存中保存动态走势图,ImageServlet.java 输出图片servlet,RandomValueThread.java模拟随机数据的线程。

为了要生成gif 图片 ,请先在http://www.fmsware.com/stuff/gif.zip 下载处理GIF图片的代码,解压之后可以发现有AnimatedGifEncoder.java, GifDecoder.java, ... 其中AnimatedGifEncoder.是用来生成GIF文件的

Gif图片比Jpeg 要小的多,另外动态走势图保存在内存中,不用生成图片文件的。

准备一张背景图片400×200大小,如下

ImageContainer.java

package com.web;

import java.awt.Color;

import java.awt.Graphics;

import java.awt.Image;

import java.awt.image.BufferedImage;

import java.io.File;

import java.io.IOException;

import java.util.LinkedList;

import java.util.List;

import javax.imageio.ImageIO;

public class ImageContainer {

public final static int MAX_LIST_SIZE = 100;

public final static int DEFAULT_WIDTH = 400;

public final static int DEFAULT_HEIGHT = 200;

public final static int DOT_WIDTH = 4;

public final static int DOT_HEIGHT = 2;

public final static String BACKGROUND_IMAGE = "/bg.gif";

private LinkedList valueList = new LinkedList();

private Image image = null;

private void loadImageFile() {

File file = new File(this.getClass().getResource(BACKGROUND_IMAGE)

.getFile());

try {

image = ImageIO.read(file);

} catch (IOException e) {

System.err.println("Can not load backgroud, reason:"

+ e.getMessage());

}

}

private ImageContainer() {

}

private static ImageContainer intance = new ImageContainer();

public static ImageContainer getInstance() {

return intance;

}

public synchronized List getList() {

return valueList;

}

public synchronized void pushValue(Integer value) {

if (valueList.size() >= MAX_LIST_SIZE) {

valueList.poll();

}

valueList.offer(value);

}

public BufferedImage draw() {

BufferedImage tag = new BufferedImage(DEFAULT_WIDTH, DEFAULT_HEIGHT,

BufferedImage.TYPE_INT_RGB);

if (image == null) {

loadImageFile();

}

if (image != null) {

int width = image.getWidth(null);

int height = image.getHeight(null);

tag.getGraphics().drawImage(image, 0, 0, width, height, null);

}

Graphics g = tag.getGraphics();

g.setColor(Color.GREEN);

List valueList = this.getList();

int x1 = 0, y1 = 0, x2 = 0, y2 = 0;

int size = valueList.size();

int offset = (MAX_LIST_SIZE - size) * DOT_WIDTH;

x1 = offset;

y1 = DEFAULT_HEIGHT-0;

for (int i = 0; i < size; i++) {

x2 = offset + i * DOT_WIDTH;

y2 = DEFAULT_HEIGHT-(Integer) valueList.get(i) * DOT_HEIGHT;

g.drawLine(x1, y1, x2, y2);

System.out.printf("drawLine[%d,%d,%d,%d]", x1, y1, x2, y2);

x1 = x2;

y1 = y2;

}

System.out.println();

return tag;

}

}

RandomValueThread.java

package com.web;

import java.util.Random;

public class RandomValueThread extends Thread {

private boolean isRunning = false;

public synchronized boolean isRunning() {

return isRunning;

}

public synchronized void setRunning(boolean isRunning) {

this.isRunning = isRunning;

}

@Override

public synchronized void start() {

isRunning = true;

super.start();

}

@Override

public void run() {

int v;

Random randomp = new Random();

while (isRunning) {

v = randomp.nextInt(100);

System.out.println("Put random value=" + v);

ImageContainer.getInstance().pushValue(v);

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

}

}

}

}

ImageServlet.java

package com.web.servlet;

import giftool.AnimatedGifEncoder;

import java.awt.image.BufferedImage;

import java.io.IOException;

import java.io.OutputStream;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import com.web.ImageContainer;

import com.web.RandomValueThread;

public class ImageServlet extends HttpServlet {

private static final String GIF = "image/gif";

private static final String JPG = "image/jpeg";

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

response.setContentType(GIF);

BufferedImage image = ImageContainer.getInstance().draw();

OutputStream out = response.getOutputStream();

// JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);

// encoder.encode(image);

AnimatedGifEncoder encoder = new AnimatedGifEncoder();

encoder.setRepeat(0);

encoder.start(out);

encoder.addFrame(image);

encoder.finish();

out.close();

}

public void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

doGet(request, response);

}

public void init() throws ServletException {

// Start random value thread

RandomValueThread thread = new RandomValueThread();

thread.setDaemon(true);

thread.start();

}

}

web.xml 加入

ImageServlet

com.web.servlet.ImageServlet

ImageServlet

/ImageServlet

demo.htm

Memory Copy Buffer Image

function refreshImage() ...{

document.getElementById("viewImg").src="ImageServlet?"+Math.random();

setTimeout(refreshImage,1000);

}

setTimeout(refreshImage,1000);

最终演示效果图:

posted on 2008-06-25 11:25 蒋家狂潮 阅读(1217) 评论(0)  编辑  收藏

java走势图_JAVA 如何实现WEB上曲线走势图相关推荐

  1. java servlet 学习_java学习之web基础(1):Servlet

    tomcat添加多个module Servlet idea中的project相对于eclipse中的workspace的概念,因此先创建一个project然后在这个project中创建一个module ...

  2. java折线图_Java系列:JFreeChart在线制作折线图

    一.概述: JFreeChart是JAVA平台上的一个开放的图表绘制类库.它完全使用JAVA语言编写,是为applications, applets, servlets 以及JSP等使用所设计.JFr ...

  3. java 饼图 框架_Java 在 Excel 中创建饼图/环形图

    import com.spire.xls.*;importcom.spire.xls.charts.ChartSerie;importcom.spire.xls.charts.ChartSeries; ...

  4. java 微信多媒体文件_java微信接口之三—上传多媒体文件

    一.微信上传多媒体接口简介 1.请求:该请求是使用post提交from来实现的,我们可以在网页上进行表单提交来实现.地址为: http://file.api.weixin.qq.com/cgi-bin ...

  5. 各种经典java小游戏_Java是这个世界上最好的语言!

    为什么? 请看TIOBE最新发布的编程语言排行榜: TIOBE开发语言排行榜每月更新一次,其结果可以用来检阅开发者的编程技能能否跟上趋势,或是否有必要作出战略改变,以及什么编程语言是应该及时掌握的. ...

  6. java excel 饼图_Java 在 Excel 中创建饼图/环形图

    饼图是Excel中常见的一种圆饼形图表工具,它能够直接以图形的方式展现各个组成部分在整体中所占的比例,从而帮助我们更加快速直观的去分析和理解抽象的数据.而环形图则是饼图的一种变形,在视觉上,环形图去掉 ...

  7. java调用excel在页面生成饼状图_Java 在 Excel 中创建饼图/环形图

    饼图 是 Excel中常见的一种圆饼形图表工具 ,它 能够直接以图形的方式 展现 各个组成部分 在整体中 所 占 的比例,从而帮助 我们更加快速直观的去分析和理解抽象的数据.而环形图 则 是饼图的一种 ...

  8. java ftp删除_java ftp实现文件上传和删除

    package com.tw.ftp; import java.io.File; import java.io.FileInputStream; import java.io.IOException; ...

  9. java jpanel 间距_Java的 . 调整JPanel上的问题大小

    BorderLayout 没有为此任务剪切,因为它为 CENTER 组件提供了所有剩余空间 . 如果您可以将布局更改为 GridBagLayout ,则最简单的方法是将最左侧的组件全部留在空间上 . ...

最新文章

  1. 自动化专业是不是计算机专业,自动化专业算不算计算机专业?
  2. 2018年智能化发展趋势:语音交互全球开战、AI终端趋势显现
  3. (0012) iOS 开发之MAC 终端命令学习
  4. 嘉兴新型智慧城市建设带来的三个问号
  5. 用matplotlib显示一下MNIST数据集中手写数字的真实面目
  6. 回归--一个平凡人的2018年总结及2019年展望
  7. 新建了一个英文Blog
  8. 利用VC++实现局域网实时传输
  9. 如何维持手机电池寿命_充电小知识:你知道如何正确充电吗?这几种充电方式最损害电池...
  10. BZOJ 4884 [Lydsy2017年5月月赛]太空猫(单调DP)
  11. php调用美图接口,网易美图 API 接口调用与请求方法详细教程
  12. kvm上添加万兆网卡_烂泥:为KVM虚拟机添加网卡
  13. 又一个被JavaScript攻占的领域:物联网
  14. Linux单机安装kafka
  15. office一直提示配置进度与图标问题
  16. 小鸡模拟器android,安卓小鸡模拟器运行总结~
  17. Ps 2022 版新增功能及改进
  18. 定义一个基类BAse,有两个公有成员函数fn1,fn2;私有派生出derived类,如何通过derived类的对象调用基类的函数fn1;
  19. 天池比赛——新闻文本分类比赛(零基础入门NLP)
  20. 做表情包就能卖1亿刀,这事儿放在国内我是不信的

热门文章

  1. python搜题手机软件_智慧职教APPPython程序设计基础答案搜题公众号
  2. Html/CSS动画效果个人练习(11)
  3. 华为nova5ipro的优缺点_如何评价华为Nova5i Pro?
  4. DispatcherServlet的url-pattern配置
  5. Linux下安装jdk环境
  6. 2018年区块链落地的现状、阻碍与机遇
  7. 王者荣耀、英雄联盟手游公会一键加入公会群怎么做的?一键生成代码代码教程
  8. 奇怪的文件路径问题(\ \\ / //等) getAbsolutePath与getCanonicalPath
  9. Java实现“xx车行管理系统”
  10. 手游聊天软件遇到大型攻击怎么办?游戏盾SDK清洗无忧