用JSP创建可重用的图形背景

有一个技术可以在Java Server Pages(JSP)中产生整齐、精细的直方图,它可以用来作为可重用的背景。为了达到可重用性的目的,你需要使得图形的尺寸可以调整,你还应该管理直方块以免它们越过图形区域的边界。然后,你还需要把图形数据编码为一种可用的图形格式。我们将利用这个代码例子介绍本技巧。

你需要什么?

为了开始运行本文所给出的例子,你需要JDK 1.2或者它的更高版本(http://java.sun.com)。你还需要一个支持JSP的Web服务器。我在Tomcat上测试该例子,我用com.sun.image.codec.jpeg 类(在Sun Java 2 SDK中发布)进行图形数据的编码。

可重用的背景

既然你希望拥有可重用的背景,你应该创建一个Java类来管理布局,包括标题区和外部边界。如A所示。

图A

正如你所看到的那样,我在标题区和外部边界上都进行了阴影处理。标题有一个白色的、一个象素宽的边界,图形区有一个细的黑色边界。这些边界增加了阴影的清晰度。

边界很容易产生。用Graphics2D对象的fill()方法来填充一个蓝色的标题矩形,然后用draw()方法用其它颜色画出边界。

产生阴影效果也很简单。首先,用fill()方法画出一个阴影。然后,在偏移七个象素的地方画出标题。这个偏移产生了三维的效果,这样就得到了阴影效果。

举一个例子

假设有一家公司销售农产品,它需要一个直方图来显示销售额。在实际应用场合下,我们需要从一个数据库或者XML文件中获取这些数据,但是为了简单起见,我们假设销售额数据保存在下面的两个数组中:
String datanames[] = {"苹果", "桔子", "桃子", "柠檬", "柚子"};
int datavalues[] = {11, 62, 33, 102, 50};

第一个数组保存该公司出售的各种农产品的项目。第二个数组为对应各农产品的销售额。

准备好直方图

直方图将以JPEG格式显示和保存,所以我们需要正确设置MIME,即内容类型。浏览器利用MIME类型来决定如何做出反应。下面的代码用以设置MIME类型:
response.setContentType("image/jpeg");

接下来,我们需要一个表示该图像的对象。Java 2D API支持BufferedImage类,它提供了一种在内存中保存和管理象素数据的方法。我们希望图形是彩色的,所以使用了TYPE_INT_RGB图形类型。WIDTHHEIGHT这两个整形数据用来以象素为单位指定该图像的宽度和高度:
BufferedImage bi = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);

现在我们有个一个BufferedImage对象,我们可以通过调用该对象的createGraphics()方法来设置Graphics2D的内容:
Graphics2D biContext = bi.createGraphics();

宽度、高度和极大值

创建该图的程序员需要根据该图形的重要程度和页面的整体布局来设置WIDTH参数。图形元素根据图形宽度的改变自动调整自身的大小。

标题的宽度和边界区域,以及图形的最长直方块需要根据WIDTH参数进行计算。这样做的目的是为了确保所有的图形元素都没有超过图形的宽度而越过图形的右边界。

需要显示的数据条目数决定了图形的HEIGHT参数。如果有新的元素添加到datavalues[]datanames[]数组,那么图形的高度就应该对应增长以适应所需显示的区域大小。

maximum参数用于最长直方块。然后,其它直方块的宽度按照相对于maximum的量进行计算:
int barWidth = (innerWIDTH * currentValue) / maximum;

上面的算法用到了maximum和图形的innerWIDTH(图形区域)这两个数值来确保直方块会随着WIDTH数值的改变而自动伸缩。

显示图形背景

为了显示该图形,我们需要创建一个背景图像,然后添加图形数据。首先,创建一个graphBG对象并调用它的draw()方法:
graphBG gr = new graphBG();
gr.draw(biContext, WIDTH, HEIGHT, "Farm Produce", "Overall Average: " + average);

draw()方法的参数包括图形内容、biContext、WIDTHHEIGHTgraphBG类利用它们来决定标题和图形区域的宽度和高度。最后,计算average数据值并添加到标题中显示的文本中。

创建直方块

每个直方块的纵坐标(y轴)位置按照如下公式计算:y_pos = i * displayHeight + headerOffset。其中displayHeight等于直方块上文本的高度加上直方块的高度,headerOffset表示从图形顶端开始的垂直距离,包括标题区域以及阴影的高度。

我用了前面创建标题边界的技术创建了这些直方块以及它们的边界。我把直方块边界的宽度和高度分别减去一个象素,这样每个直方块看起来都有一个红色的边界,并通过在白色背景上画上内边界使得减切效果的产生变得简单起来。

编码

我们已经在内存中建立好了这幅图片,现在我们对它进行编码并把它显示给用户。我们不能用默认得JSP输出流来处理JPEG,所以我们需要利用response.getOutputStream()从响应对象中获取流。我们可以用输出流来创建一个JPEGImageEncoder对象并调用它的encode(),传递我们在前面创建的BufferedImage对象:
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(output);
encoder.encode(bi);

产生的图象相对较小,只占用了13.7千字节的容量。B给出了最终的效果:

图B

无论从那个方面来说,index.jsp的输出都是一个JPEG图像。你可以把它保存到你的桌面上或者按PrintScreen键来抓图。如果你需要在同一页上显示多幅图形或者把图形引入到其它内容中,你可以使用HTML的img标记(<img src = ”index.jsp”>),然后,当需要时放置该图,如利用一个表格。

也许最老的用于动态产生图形的Internet技术之一可以实现处了显示一个图像之外的其它任务。设想你需要记录这副图的浏览人数(类似记录广告点击次数的情况),那么你需要在index.jsp中实现诸如点击计数、数据库或者文件访问之类的任务,你可以在后台处理这些任务而不需要利用缓冲页面切换给用户。

结论

我们在本文之中检验了一种产生整齐、看上去很舒服的直方图。我们巧妙的处理了图形尺寸的改变以及编码为JPEG格式,并且讨论了通过修改HTML代码的方式把最终产生的图片放置在页面的不同位置上。

(0)

相关推荐

  • 解析Java图形化编程中的文本框和文本区

    在图形界面中,文本框和文本区是用于信息输入输出的组件. 文本框 文本框(JTextField)是界面中用于输入和输出一行文本的框.JTextField类用来建立文本框.与文本框相关的接口是ActionListener. 文本框处理程序的基本内容有以下几个方面: 声明一个文本框名. 建立一个文本框对象. 将文本框对象加入到某个容器. 对需要控制的文本框对象注册监视器,监听文本框的输入结束(即输入回车键)事件. 一个处理文本框事件的方法,完成对截获事件进行判断和处理. JTextField类的主要构

  • jsp实现生成中国国旗图片效果代码

    本文实例讲述了jsp实现生成中国国旗图片效果代码.分享给大家供大家参考,具体如下: 图片截图如下: 具体代码如下: <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ page contentType="image/jpeg" import="java.awt.*, java.awt.image.*,jav

  • Java Web开发之图形验证码的生成与使用方法

    本文实例讲述了Java Web开发之图形验证码的生成与使用方法.分享给大家供大家参考.具体如下: 图形验证码的主要目的是为了增强的安全性,增加用户通过遍历所有可能性来破解密码的难度. 图形验证码的使用包括如下3部分: ① 图形验证码的生成: ② 在页面中的使用: ③ 验证: 1.图形验证码的生成 假设在Servlet生成图形验证码,在JavaBean或者JSP中生成的基本过程是相同的.设计如下过程: ① 设置响应的文档类型: ② 生成随机码: ③ 把随机码保存到session中: ④ 生成图片:

  • 使用Java编写图形化的菜单的教程

    有两种类型的菜单:下拉式菜单和弹出式菜单.本章只讨论下拉式菜单编程方法.菜单与JComboBox和JCheckBox不同,它们在界面中是一直可见的.菜单与JComboBox的相同之处是每次只可选择一个项目. 在下拉式菜单或弹出式菜单中选择一个选项就产生一个ActionEvent事件.该事件被发送给那个选项的监视器,事件的意义由监视器解释. 菜单条.菜单和菜单项 下拉式菜单通过出现在菜单条上的名字可视化表示,菜单条(JMenuBar)通常出现在JFrame的顶部,一个菜单条显示多个下拉式菜单的名字

  • jsp中点击图片弹出文件上传界面及预览功能的实现

    花了两天时间琢磨一下图片预览的功能 任务需求如下: 1:jsp页面中有一个图片(pic_1) 2:点击图片弹出类似于资源管理器的界面 3:选择完某一个图片之后在pic_1处预览 我在IE8上试验下面这段代码,可以实现上述功能,没有在别的浏览器中测试,如果各位朋友知道多种浏览器的支持方法,请赐教,共同学习,谢谢. 复制代码 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http:

  • 详解Java图形化编程中的鼠标事件设计

    鼠标事件的事件源往往与容器相关,当鼠标进入容器.离开容器,或者在容器中单击鼠标.拖动鼠标时都会发生鼠标事件.java语言为处理鼠标事件提供两个接口:MouseListener,MouseMotionListener接口. MouseListener接口 MouseListener接口能处理5种鼠标事件:按下鼠标,释放鼠标,点击鼠标.鼠标进入.鼠标退出.相应的方法有: (1) getX():鼠标的X坐标 (2) getY():鼠标的Y坐标 (3) getModifiers():获取鼠标的左键或右键

  • 使用Java打印数字组成的魔方阵及字符组成的钻石图形

    打印魔方阵 输入一个自然数N(2≤N≤9),要求输出如下的魔方阵,即边长为N*N,元素取值为1至N*N,1在左上角,呈顺时针方向依次放置各元素.  N=3时: 1 2 3 8 9 4 7 6 5 [输入形式] 从标准输入读取一个整数N.  [输出形式] 向标准输出打印结果.输出符合要求的方阵,每个数字占5个字符宽度,向右对齐,在每一行末均输出一个回车符. [输入样例]  4 [输出样例] 1 2 3 4 12 13 14 5 11 16 15 6 10 9 8 7 实现: package cn.

  • java图形界面编程之模拟血压计

    复制代码 代码如下: package GraphicsCanvas; import java.awt.BorderLayout;import java.awt.Canvas;import java.awt.Color;import java.awt.Graphics;import java.awt.Image;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.JBut

  • 轻松使用JSP生成饼图

    作者: BUILDER.COM JSP提供了很多简单实用的工具,其中包括从数据库中读出数据,发送数据,并能够把结果显示在一个饼状图形.现在让我们看看这一简单而实用的方法. 你所需要的东西 转自:动态网制作指南 www.knowsky.com 为了能正确运行这一文章相关的范例,你必须需要JDK 1.2或更高的版本.一个关系数据库管理系统.一个JSP网络服务器.我都是在Tomcat调试这些例子,同时我也使用了Sun Java 2 SDK发布的com.sun.image.codec.jpegclass

  • Java计算几何图形面积的实例代码

    对于每个几何图形而言,都有一些共同的属性,如名字.面积等,而其计算面积的方法却各不相同.为了简化开发,请编写程序,定义一个超类来实现输入名字的方法,并使用抽象方法来计算面积. 思路分析: 所谓超类就是抽象父类,该抽象类中有两个方法,分别用来获取图形的名称和图形的面积.要获得图形的名称,通过类的getClass().getSimpleName()方法可以实现:要获得图形的面积,因为计算面积的方法各不相同,所以该方法是个抽象方法.定义一个子类表示圆形,圆形的半径通过构造方法获得,圆形的面积通过重写超

  • JavaWeb实现图形报表折线图的方法

    本文实例讲述了JavaWeb实现图形报表折线图的方法.分享给大家供大家参考,具体如下: 步骤说明: 1. 导入log4j.jar,jfreechart-0.9.18.jar,jdom.jar,jcommon-0.9.3.jar四个jar包 2. 在某个包中写入Tuxin.Java类 package com.mengya.util; import java.awt.Color; import java.awt.Font; import java.io.PrintWriter; import jav

随机推荐