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...

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

最近在做数据挖掘的课程设计,需要将数据分析的结果很直观的展现给用户,这就要用到数据统计图,要实现这个功能就需要几个第三方包了: 1.       jfreechart-1.0.13.jar 2. ...
  • pzhtpf
  • pzhtpf
  • 2012年05月24日 22:28
  • 101131

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

最近在做数据挖掘的课程设计,需要将数据分析的结果很直观的展现给用户,这就要用到数据统计图,要实现这个功能就需要几个第三方包了: 1.       jfreechart-1.0.13.jar ...

java二维坐标动态曲线图绘制

将一串随机数输入到二维坐标轴中,不断刷新JPanel,实现动态显示的效果 import java.awt.BasicStroke; import java.awt.BorderLayout; impo...

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

实现非常简单,例子主要有3个类,ImageContainer.java 在内存中保存动态走势图,ImageServlet.java 输出图片servlet,RandomValueThread.java...
  • ahhsxy
  • ahhsxy
  • 2012年03月13日 16:56
  • 3093

java-后台生成图表、并将图表保存为PNG图片

创建图表步骤: * 1:创建数据集合 * 2:创建Chart: * 3:设置抗锯齿,防止字体显示不清楚 * 4:对柱子进行渲染, *...
  • luckycz
  • luckycz
  • 2015年08月12日 16:29
  • 7783

Java生成svg曲线图

         参照“super的小歇”写的《JAVA生成SVG图表实例之柱状图 1.1》http://blog.csdn.net/turing_gu/archive/2004/09/03/9407...
  • chilong
  • chilong
  • 2007年09月06日 14:23
  • 4505

Java 学习笔记之jfreechart 生成折线图,饼图, ...

package com.yyh.jfreechart; import java.awt.Color; import java.awt.Font; import java.io.File; impor...
  • SJF0115
  • SJF0115
  • 2011年12月10日 12:54
  • 10804

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

JavaWeb图表插件的小研究

背景 最近的一个项目中,对数据的统计分析有很大的要求,这就要求有一款很强大的报表、图表插件。因此,组长给分了任务,让我们各自去研究不同的图表插件。用了一两天的时间,对java这块的图表插件做了一个...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:JAVA 如何实现WEB上曲线走势图
举报原因:
原因补充:

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