JAVA 如何实现WEB上曲线走势图

原创 2007年09月27日 22:13:00

实现非常简单,例子主要有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<Integer> valueList = new LinkedList<Integer>();

    
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, 
00, 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 加入

  <servlet>
    <servlet-name>ImageServlet</servlet-name>
    <servlet-class>com.web.servlet.ImageServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>ImageServlet</servlet-name>
    <url-pattern>/ImageServlet</url-pattern>
  </servlet-mapping>

 

demo.htm

<html>
    
<body>
        Memory Copy Buffer Image
        
<br>

        
<img src="" id="viewImg" />
    
</body>
</html>
<script language="javascript">
function refreshImage() {
 document.getElementById(
"viewImg").src="ImageServlet?"+Math.random();
 setTimeout(refreshImage,
1000);
}


setTimeout(refreshImage,
1000);
</script>

 

最终演示效果图:

Java实现图表趋势图的展现

JS: //评分趋势 progressLoadNew({ body: '#lineScore' }); $.post(basePath + 'pfmReport/getExportRepor...
  • LazyTojava
  • LazyTojava
  • 2017年05月07日 22:40
  • 1010

使用Java代码的方式实现简易的走势图(1)

这是我第二篇CSDN文章了,写这篇文章的时候,心态已经发生了些变化。因为最近看了一个朋友介绍的一本书《奇特的一生》。在很多人看来,书中的主人翁柳比歇夫生活、工作的方法饱受争议。但是,在我看来,如果一个...
  • u014655010
  • u014655010
  • 2017年03月31日 20:46
  • 891

使用java实现的Bezier曲线

  • 2012年05月26日 19:39
  • 1KB
  • 下载

Java实现的二维坐标趋势图(血压变化趋势图)

本实例出自项目一处,希望能和大家一起分享交流。版权所有,转载请注明出处,尊重知识,敬畏劳动。 一、程序说明 1、自定义血压变化趋势图class MyCanvas 继承 Canvas类,重写其中的...
  • oFanJunBin
  • oFanJunBin
  • 2014年03月02日 14:29
  • 3672

java 彩票走势图算法

本博文主要写了彩票走势图中的遗漏值、出现总次数、平均遗漏值、最大遗漏值、最大连出值的计算方法。...
  • jetfill
  • jetfill
  • 2017年09月30日 15:10
  • 412

用Java实现股票走势图

  • 2013年02月28日 16:48
  • 30KB
  • 下载

Java股票数据下载

package main; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStr...
  • china_demon
  • china_demon
  • 2016年07月05日 05:01
  • 840

java绘制股票走势图

  • 2011年04月20日 21:50
  • 3KB
  • 下载

在JAVAWEB项目中用JSP生成数据库数据曲线图

简介该项目是在后台调取数据库数据在DAO层进行处理,再把处理完的数据集合传到SERVICE层,之后JSP页面将SERVICE层的数据生成以时间为X轴,数量为Y轴的曲线图。 这是SERVICE层调取的...
  • gaoxiang0522
  • gaoxiang0522
  • 2017年04月18日 13:58
  • 164

java实现各种数据统计图(柱形图,饼图,折线图)

最近在做数据挖掘的课程设计,需要将数据分析的结果很直观的展现给用户,这就要用到数据统计图,要实现这个功能就需要几个第三方包了: 1.       jfreechart-1.0.13.jar 2. ...
  • pzhtpf
  • pzhtpf
  • 2012年05月24日 22:28
  • 109200
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:JAVA 如何实现WEB上曲线走势图
举报原因:
原因补充:

(最多只允许输入30个字)