Wednesday, January 7, 2009

struts开发实践—曲线图实例

From: http://www.7880.com/Info/Article-456d7000.html

本案主要功能是完成曲线图的绘制,并将曲线图生成jpg图形并显示。
1。画图的主要函数说明
Graphics g
g.drawRect(x_top,x_bottom,width,height):画矩形
g.setColor(color):指定颜色;
g.fillRect(x_top,x_bottom,width,height):画填充的矩形//
g.drawRoundRect(x_top,x_bottom,width,height):画圆边矩形
g.fillRoundRect(x_top,x_bottom,width,height):画一个填充的圆边矩形
g.drawArc(beg_x,beg_y,width,height,beg_tangle,end_tangle):画弧线
g.fillArc(beg_x,beg_y,width,height,beg_tangle,end_tangle):填充弧
g.drawLine(beg_x,beg_y,end_x,end_y):画一条直线
g.drawString(theString,stringTopLeft_x,StringTopLeft_y):画字
g.setFont(font):设置画笔的字体
g.setPaint(color):设置画笔的颜色
2。曲线图绘制文件
/*****************program CurveFrame begin************************/
package test;
import java.awt.*;
import java.awt.geom.*;
import java.awt.image.*;
import javax.swing.JFrame;
import java.lang.Math;
/** *曲线图绘制 */
public class CurveFrame
extends JFrame {
/**数据*/
private double[] result;
/**数据项名称*/
private String[] title;
/**参数:结果集,名称集*/
public CurveFrame(double[] result, String[] title) {
this.result = result;
this.title = title;
}
public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
Dimension dim = this.getSize();
g2.setColor(Color.white);
g2.fillRect(0, 0, dim.width, dim.height);
//写title;
Font font = g2.getFont().deriveFont(12.0f);
g2.setFont(font);
FontMetrics metrics = g2.getFontMetrics();
g2.setPaint(Color.black);
g2.drawString(title[0], (dim.width - title[0].length() * 5) / 2, 10);
// draw the x and y axis
g2.setStroke(new BasicStroke(2.0f));
g2.draw(new Line2D.Double(40, 30, 40, dim.height - 30));
g2.draw(new Line2D.Double(40, dim.height - 30,
dim.width - 20, dim.height - 30));
long unit=(Math.round((result[0]+750)/1500))*50;
long yMax = result[0] == 0 ? unit : Math.round((result[0]+unit/2)/unit) * unit;
int widthPer = (dim.width - 40) / result.length;
long heightPer = (dim.height - 60) / (yMax / unit);
//draw the y axis scale;
g2.setPaint(Color.lightGray);
g2.setStroke(new BasicStroke(1.0f));
for (int i = 0; i<=yMax / unit; i++) {
g2.draw(new Line2D.Double(40, dim.height - 30 - i * heightPer,
dim.width - 40, dim.height - 30 - i * heightPer));
String ylabel = String.valueOf(i * unit);
g2.drawString(ylabel, 35 - metrics.stringWidth(ylabel),
dim.height - 30 - (i * heightPer));
}
//draw x title;
GeneralPath path = new GeneralPath(GeneralPath.WIND_EVEN_ODD,
result.length - 2);
for (int i = 1; i < result.length; i++) {
//draw x scale;
g2.setPaint(Color.lightGray);
g2.setStroke(new BasicStroke(1.0f));
g2.draw(new Line2D.Double(40 + (i - 1) * widthPer, dim.height - 30,
40 + (i - 1) * widthPer,30));
font = g2.getFont().deriveFont(10.0f);
g2.setFont(font);
g2.setPaint(Color.black);
g2.drawString(title[i], 40 + widthPer * (i - 1)-metrics.stringWidth(title[i])/2, dim.height - 10);
g2.setPaint(Color.red);
g2.setStroke(new BasicStroke(2.0f));
if (i == 1) {
path.moveTo(40,
Math.round(dim.height - 30 -
(result[i] / unit) * heightPer));
}
else {
path.lineTo(Math.round(widthPer * (i - 1)) + 40,
Math.round(dim.height - 30 -
(result[i] / unit) * heightPer));
}
}
g2.draw(path);
}

}
/*****************program end************************/
3。生成jpg图形并显示
/*****************program begin************************/
package test;

import org.apache.struts.action.*;
import javax.servlet.http.*;
import javax.servlet.*;
import java.io.*;
import java.util.*;

import java.awt.*;
import java.awt.image.*;
import com.sun.image.codec.jpeg.*;


/**
* 变化曲线
*/
public class WageChangeCurveAction
extends Action {
private static final String CONTENT_TYPE = "image/gif";
private static final int WIDTH = 700;
private static final int HEIGHT = 500;
public ActionForward perform(ActionMapping mapping, ActionForm form,
HttpServletRequest request,
HttpServletResponse response) throws IOException,
ServletException {
response.setContentType(CONTENT_TYPE);
ServletOutputStream out = response.getOutputStream();
double[] result=。。。String[] title = 。。。//获得图形数据
try {
CurveFrame dummy = new CurveFrame(result,title);
dummy.setSize(new Dimension(WIDTH, HEIGHT));
BufferedImage image = new BufferedImage(WIDTH, HEIGHT,
BufferedImage.TYPE_INT_RGB);
Graphics2D g2 = image.createGraphics();
dummy.paint(g2);
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
encoder.encode(image);
out.flush();
}
catch (Throwable e) {
e.printStackTrace();
}
return mapping.findForward("success");
}

}
/*****************program end************************/

No comments: