java走势图_JAVA 如何实现WEB上曲线走势图
转载自: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上曲线走势图相关推荐
- java servlet 学习_java学习之web基础(1):Servlet
tomcat添加多个module Servlet idea中的project相对于eclipse中的workspace的概念,因此先创建一个project然后在这个project中创建一个module ...
- java折线图_Java系列:JFreeChart在线制作折线图
一.概述: JFreeChart是JAVA平台上的一个开放的图表绘制类库.它完全使用JAVA语言编写,是为applications, applets, servlets 以及JSP等使用所设计.JFr ...
- java 饼图 框架_Java 在 Excel 中创建饼图/环形图
import com.spire.xls.*;importcom.spire.xls.charts.ChartSerie;importcom.spire.xls.charts.ChartSeries; ...
- java 微信多媒体文件_java微信接口之三—上传多媒体文件
一.微信上传多媒体接口简介 1.请求:该请求是使用post提交from来实现的,我们可以在网页上进行表单提交来实现.地址为: http://file.api.weixin.qq.com/cgi-bin ...
- 各种经典java小游戏_Java是这个世界上最好的语言!
为什么? 请看TIOBE最新发布的编程语言排行榜: TIOBE开发语言排行榜每月更新一次,其结果可以用来检阅开发者的编程技能能否跟上趋势,或是否有必要作出战略改变,以及什么编程语言是应该及时掌握的. ...
- java excel 饼图_Java 在 Excel 中创建饼图/环形图
饼图是Excel中常见的一种圆饼形图表工具,它能够直接以图形的方式展现各个组成部分在整体中所占的比例,从而帮助我们更加快速直观的去分析和理解抽象的数据.而环形图则是饼图的一种变形,在视觉上,环形图去掉 ...
- java调用excel在页面生成饼状图_Java 在 Excel 中创建饼图/环形图
饼图 是 Excel中常见的一种圆饼形图表工具 ,它 能够直接以图形的方式 展现 各个组成部分 在整体中 所 占 的比例,从而帮助 我们更加快速直观的去分析和理解抽象的数据.而环形图 则 是饼图的一种 ...
- java ftp删除_java ftp实现文件上传和删除
package com.tw.ftp; import java.io.File; import java.io.FileInputStream; import java.io.IOException; ...
- java jpanel 间距_Java的 . 调整JPanel上的问题大小
BorderLayout 没有为此任务剪切,因为它为 CENTER 组件提供了所有剩余空间 . 如果您可以将布局更改为 GridBagLayout ,则最简单的方法是将最左侧的组件全部留在空间上 . ...
最新文章
- 自动化专业是不是计算机专业,自动化专业算不算计算机专业?
- 2018年智能化发展趋势:语音交互全球开战、AI终端趋势显现
- (0012) iOS 开发之MAC 终端命令学习
- 嘉兴新型智慧城市建设带来的三个问号
- 用matplotlib显示一下MNIST数据集中手写数字的真实面目
- 回归--一个平凡人的2018年总结及2019年展望
- 新建了一个英文Blog
- 利用VC++实现局域网实时传输
- 如何维持手机电池寿命_充电小知识:你知道如何正确充电吗?这几种充电方式最损害电池...
- BZOJ 4884 [Lydsy2017年5月月赛]太空猫(单调DP)
- php调用美图接口,网易美图 API 接口调用与请求方法详细教程
- kvm上添加万兆网卡_烂泥:为KVM虚拟机添加网卡
- 又一个被JavaScript攻占的领域:物联网
- Linux单机安装kafka
- office一直提示配置进度与图标问题
- 小鸡模拟器android,安卓小鸡模拟器运行总结~
- Ps 2022 版新增功能及改进
- 定义一个基类BAse,有两个公有成员函数fn1,fn2;私有派生出derived类,如何通过derived类的对象调用基类的函数fn1;
- 天池比赛——新闻文本分类比赛(零基础入门NLP)
- 做表情包就能卖1亿刀,这事儿放在国内我是不信的
热门文章
- python搜题手机软件_智慧职教APPPython程序设计基础答案搜题公众号
- Html/CSS动画效果个人练习(11)
- 华为nova5ipro的优缺点_如何评价华为Nova5i Pro?
- DispatcherServlet的url-pattern配置
- Linux下安装jdk环境
- 2018年区块链落地的现状、阻碍与机遇
- 王者荣耀、英雄联盟手游公会一键加入公会群怎么做的?一键生成代码代码教程
- 奇怪的文件路径问题(\ \\ / //等) getAbsolutePath与getCanonicalPath
- Java实现“xx车行管理系统”
- 手游聊天软件遇到大型攻击怎么办?游戏盾SDK清洗无忧