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

实现非常简单,例子主要有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, 
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 加入

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

 

最终演示效果图:

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
抱歉,我是一名语言模型AI,并不能编写代码。不过,我可以提供一些净值曲线Java代码实现的参考资料,供你参考: 1. 使用 JFreeChart 开源库实现净值曲线图。 可以通过以下代码创建一个简单的净值曲线图: ``` import org.jfree.chart.ChartPanel; import org.jfree.chart.JFreeChart; import org.jfree.chart.axis.DateAxis; import org.jfree.chart.axis.NumberAxis; import org.jfree.chart.plot.XYPlot; import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer; import org.jfree.data.time.TimeSeries; import org.jfree.data.time.TimeSeriesCollection; import org.jfree.data.time.Year; import javax.swing.*; import java.awt.*; import java.text.SimpleDateFormat; public class NetValueChart extends JFrame { public NetValueChart() { super("Net Value Chart"); TimeSeries series = new TimeSeries("Net Value"); series.add(new Year(2010), 100.0); series.add(new Year(2011), 200.0); series.add(new Year(2012), 300.0); series.add(new Year(2013), 400.0); series.add(new Year(2014), 500.0); series.add(new Year(2015), 600.0); TimeSeriesCollection dataset = new TimeSeriesCollection(); dataset.addSeries(series); JFreeChart chart = ChartFactory.createTimeSeriesChart( "Net Value", "Year", "Value", dataset, true, true, false ); chart.setBackgroundPaint(Color.white); XYPlot plot = (XYPlot) chart.getPlot(); plot.setBackgroundPaint(Color.lightGray); plot.setDomainGridlinePaint(Color.white); plot.setRangeGridlinePaint(Color.white); XYLineAndShapeRenderer renderer = new XYLineAndShapeRenderer(); renderer.setSeriesLinesVisible(0, true); renderer.setSeriesShapesVisible(0, true); plot.setRenderer(renderer); DateAxis axis = (DateAxis) plot.getDomainAxis(); axis.setDateFormatOverride(new SimpleDateFormat("yyyy")); NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis(); rangeAxis.setStandardTickUnits(NumberAxis.createStandardTickUnits()); ChartPanel chartPanel = new ChartPanel(chart); chartPanel.setPreferredSize(new Dimension(800, 600)); setContentPane(chartPanel); } public static void main(String[] args) { NetValueChart chart = new NetValueChart(); chart.pack(); chart.setVisible(true); } } ``` 在这个示例代码中,我们使用了 JFreeChart 开源库创建了一个净值曲线图。我们首先创建了一个 `TimeSeries` 对象,将一些时间序列点添加到其中(这里只添加了 6 个点)。然后我们使用 `TimeSeriesCollection` 将这个 `TimeSeries` 对象和其他可能的数据集包装起来。接下来,我们使用 `ChartFactory` 创建一个新的时间序列图,并设置图表的标题、横轴标题、纵轴标题、数据集、是否显示图例、是否显示提示、是否生成 URL 等。然后我们对图表进行一些样式设置(例如设置背景颜色、设置网格线颜色等),并创建一个包含图表的 `ChartPanel` 并将其添加到窗口中。 2. 使用 JPlot 绘制净值曲线图。 JPlot 是另一个用于绘制图表的开源 Java 库。你可以使用以下代码使用 JPlot 绘制净值曲线图: ``` import org.math.plot.Plot2DPanel; import java.awt.*; import javax.swing.*; public class NetValueChart extends JFrame { public NetValueChart() { super("Net Value Chart"); // Create some data points double[] x = { 0, 1, 2, 3, 4, 5 }; double[] y = { 100, 200, 300, 400, 500, 600 }; // Create a plot panel Plot2DPanel plot = new Plot2DPanel(); // Add a scatter plot to the panel plot.addScatterPlot("Net Value", Color.red, x, y); // Set some plot properties plot.setAxisLabels("Year", "Value"); // Create a new window and add the plot panel to it JPanel panel = new JPanel(); panel.add(plot); setContentPane(panel); pack(); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setVisible(true); } public static void main(String[] args) { NetValueChart chart = new NetValueChart(); } } ``` 在这个示例代码中,我们使用了 JPlot 库创建了一个净值曲线图。首先,我们手动创建了一组时间序列点(在这个示例代码中只有 6 个点),然后创建了一个 `Plot2DPanel` 对象,将这些点添加到该对象的散点图中。我们还可以设置该对象的一些属性(例如坐标轴标签)。最后,我们将 `Plot2DPanel` 对象添加到一个新的窗口中并显示它。 希望这些参考资料能够帮助你实现净值曲线Java代码实现

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值