分享
 
 
 

在网页上发布统计曲线

王朝java/jsp·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

一、引言

在 寥恋腎nternet上制作极富个性化的主页、及时发布令人

心动的信息,以便吸引全世界不同肤色、不同职业的人们驻"足"观看,

以致流连忘返,甚者慷慨解囊,是Internet冲浪者心中的梦想。通过合

理运用HTML脚本语言提供的表格、列表、字体和段落的格式化、多媒

体支持等,能使网页内容清晰、层次分明、可读性强,这些已有众多文

献论述,在此不再赘述。

我们知道,在各种信息中,统计信息堪称是用得较多、具有相当说

服力的信息,而表达统计数据最直观的方式是根据这些数据绘制曲线

。文献[1]用相当的篇幅介绍了如何在Window s操作系统中编写一个

具有OLE服务器能力的统计曲线绘制工具,而本文的主题则是:如何利

用Java对绘图的支持,编写一个根据统计数据绘制曲线的小程序(Appl

et)Plot,通过把Plot编译生成的字节码文件Plot.class嵌入到HTML脚

本中,从而实现在网页上发布统计曲线的目的。

二、Java编程概述

1.Java语言规范

Java继承了C++的基本语法,摒弃了一些过时的特征,比如预编译

的头文件、宏、条件编译,数据结构的结构体、枚举体和联合体,容易

导致安全性问题的指针,以及晦涩难懂的多重继承等,借鉴了Objectiv

e C的接口和Ada的包(package),以及内置了Internet网络所需要的基

本特征:结构中立(任何芯片、任何操作系统可以运行同一版本的Java

程序)、安全性(避免感染病毒和防止非法访问)、多线程和网络通信

等。事实上,上述被Java抛弃的特征,如指针和类的多重继承,都是由

于太复杂而遭C++程序员诅咒的;而新发展的特征,如结构中立、安全

性、多线程和网络通信等,是C++程序员极想实现而又非常难实现的特

征。

2.JDK

Windows程序员一定都知道做Windows开发要用Windows SDK(软件

开发工具),现在,做Ja va开发的程序员也都知道编写Java小程序要用

JDK(Java开发工具)了。然而,与SDK主要采用结构体和函数等面向过

程的方式提供Windows编程接口不同,JDK采用包、界面和类等面向对

象的方式提供Java编程接口。从这种意义上说,JDK与Microsoft Visu

al C++的MFC,或者Bor land C++的OWL相似:它是一个类库,一个应用

框架,一个无缝集成的解决方案。

最先发布的JDK应该算JDK 1.0.3α,它是1995年Sun公司在全球范

围内进行Java程序设计大奖赛时随HotJava 1.0.3α发放的。在该版

本中,通用包实现得比较少,只有java.lang、j ava.util和java.io,

而其他有关用户界面和网络通信的包都在HotJava中提供。尔后发行

了1.0版,这是提供给各Java平台开发公司的,其中,包全部独立出来,

共八个:java.applet、ja va.awt 、java.awt.image 、java.awt.p

eer 、java.io、java.lang、java.net 和java. util 以及一个sun.

tools.debug。本文的程序基于1.0版本编写。由于1.0.3α和1.0两个

版本的包安排差别很大,因而用前一个版本编写的程序在后一个版本

的编译工具中编译有可能通不过,要作修改。在1996年8月底,Sun公司

在Internet上发布了1.1版,1.1版在

三、设计目标和程序构思

1.0版基础上稍有改进,两个版本保持完全的兼容。

现在我们回到本文的主题上。首先,考虑编写一个Java小程序,它

的界面和功能可以这样来描述:

统计标题和统计数据由HTML的param标注提供,统计数据的个数没

有限制;

根据数据的取值画出带刻度的X、Y轴;

在用线连接每个数据点的同时标出该点的坐标值;

提供绘制三组曲线的选择。

针对上述要求,考虑构造两个类来完成:Curve类用于实现绘制统

计曲线的各个方面;Plo t类则派生于Applet,它是本程序的小程序类,

通过使用Curve类来完成统计曲线的绘制。鉴于篇幅,下面给出实现要

点及其程序。如需要全部源代码的读者,请与笔者联系。

1.Curve类

Curve类构造主要基于以下几点考虑。

(1)基类。Curve从Java所有类的基类Object派生,那么就可以不

显式声明了。

class Curve {

......

}

(2)绘图环境。根据Windows等窗口操作系统的编程经验,向显示

器、打印机等输出设备绘图是通过绘图环境来实现的。由于Java要面

向所有平台,包括Windows、Unix和Macintosh 等,它们的绘图环境(如

显示器)概念很不一样。那么,Java如何来实现绘图呢?原来,Java在j

ava.awt包中通过Graphics类来提供了对各种绘图设备的设备环境的

抽象类封装。用Window s编程来作对照,Graphics所代表的概念就是W

indows GDI的设备环境(Device Context),也就是MFC中CDC类或OWL的

TDc类。有了这样的比较,对Graphics就比较好理解了。也就是,所有

绘制直线、矩形、椭圆、多边形、设置字体、绘制文本等操作,调用G

raphics类中的相应方法即可。下面代码是通过Curve构造器将小程序

类Plot的设备环境对象g传递给Curve,以被其他各个绘制方法使用:

public Curve(Graphics g)

{

myGC = g;

......

}

(3)绘制算法。绘制算法就是绘制统计曲线的实现方法,包括绘制

标题、坐标轴、数据联线、标出数据点坐标等,以及其逆过程:清除这

些绘制(因为当绘制其他曲线时,得保证刷新前一次绘制的所有内容)

。鉴于篇幅,下面仅给出显示数据的方法实现showData.

public synchronized void showData(Vector v)

{

float maxY=0;

myGC.setColor(Color.red);

int xPoint;

int yPoint;

file://确定Vector中的最大值。

for(int i = 0; i < v.size(); i++)

{

float temp = ((Float)v.elementAt(i)).floatValue();

if(temp > maxY)

{

maxY = temp;

}

}

file://确定第一个数据点的X坐标。

xPoint = xOrigin + (xSpacing/2);

int oldX = 0;

int oldY = 0;

file://在数据点处绘制一个小圆圈。

for(int j = 0; j < v.size(); j++)

{

yPoint = yOrigin(int)((axisH/maxY) *

((Float)v.elementAt(j)).floatValue());

myGC.fillRect(xPoint, yPoint, 3, 3);

file://在数据点之间联线。

if((oldX != 0) && (oldY != 0))

{

myGC.drawLine(oldX-xSpacing, oldY, xPoint, yPoint)

;

}

myGC.setColor(Color.blue);

file://在数据点边上写出数据值。

String coordString =

Float.toString(((Float)v.elementAt(j)).floatValue(

));

myGC.drawString(coordString, xPoint+5, yPoint - 4);

myGC.setColor(Color.red);

xPoint += xSpacing;

oldX = xPoint;

oldY = yPoint;

}

}

2.Plot类

Plot类构造主要基于以下几点考虑。

(1)派生于Applet

一个Java小程序有且只有一个类派生于Applet,这就好像在MFC中

,必须有且只有一个类派生于CWinApp一样。另外,与MFC程序不一样的

是,不管包含派生于Applet类的源程序文件( .java)命名为什么,生成

的供网页使用的字节码文件(.class)只与该派生类同名,而与源文件

名无关,这一点容易引起混淆。打个比方,如果包含Plot类的文件为Pl

otTest.java,而编译生成的字节码文件名为Plot.class,而不是PlotT

est.class。最后,Plot必须声明为public,这是由于一个编辑单元必

须有且只有一个类声明为public。

public class Plot extends Applet

{

......

}

(2)用户界面

目前,Java在java.awt中提供小程序的用户界面所需要的接口和

类(共42个类和2个接口),其中实现了我们在Windows中见到的各种用

户界面,比如,菜单、对话框,以及各种控件,如按钮、列表框、复选框

、单选框、编辑框、组合框等。鉴于本程序要求从3组数据中选择一

组进行绘制,需要选用单选框控件。单选框在java.awt中用Checkbox

和CheckboxGroup两个类联合实现:当Checkbox单独使用时,它是复选

框;而把它添加到CheckboxGroup中则变成了单选框。

public void init()

{

......

cbg = new CheckboxGroup();

file://单选按钮。

cb1 = new Checkbox("数据1", cbg, false);

cb2 = new Checkbox("数据2", cbg, false);

cb3 = new Checkbox("数据3", cbg, false);

}

(3)布局管理器

在Java中,为了使得小程序在各种操作系统中的用户界面具有一

致的外观,采用布局管理器(Layout Manager)对用户界面的相对位置

进行管理。Java在java.awt包中包含了流布局管理器(FlowLayout)、

边界布局管理器(BorderLayout)、卡片布局管理器(CardLayout)、网

格布局管理器(GridLayout)和网格包布局管理器(GridBagLayout)5个

布局管理器。如果希望3 个单选框按钮放在绘制图形的下面按一行排

列,该如何编写代码呢?可以这样来实现:首先设置Plot小程序为边界

布局,然后为3个单选框按钮创建一个Panel对象cbPanel,用于组织3个

控件,并设置cbPanel为网格布局,最后将cbPanel添加到Plot类中,并

设置其方向为南(South)。

public void init()

{

......

file://设置Plot为边界布局。

setLayout(new BorderLayout());

file://为3个控件申请面板对象cbPanel。

cbPanel = new Panel();

file://设置网格布局管理器,并按1×3方式排列。

cbPanel.setLayout(new GridLayout(1, 3));

file://为各按钮申请1个面板。

cb1Panel = new Panel();

cb1Panel.add(cb1);

cb2Panel = new Panel();

cb2Panel.add(cb2);

cb3Panel = new Panel();

cb3Panel.add(cb3);

file://添加到统一的1个面板cbPanel中。

cbPanel.add(cb1Panel);

cbPanel.add(cb2Panel);

cbPanel.add(cb3Panel);

file://添加cbPanel到Plot中,方向为:图形在北,按钮在南。

add("South", cbPanel);

}

(4)读取HTML参数

因为本程序要用到统计数据和统计标题作为小程序的参数存放在

HTML文档中,所以在开始绘制图形之前,需要从HTML读取这些参数,然

后才开始显示标题和绘制统计曲线。其中,读取统计标题和统计数据

分别实现。

①统计标题,其格式可以是:

<param value="1-DESC" value="每月访问者统计">

1-DESC表示第一组数据的统计标题,"每月访问者统计"是标题内

容。

public String readStringData(String s)

{

String tempString = null;

Integer param;

boolean datapresent = true;

int i = 0;

try

{

tempString = getParameter(s + "-DESC");

} catch (Exception e)

{

System.out.println(e);

}

return tempString;

}

②统计数据,格式可以是:

<param value="1-2" value="14">

1-2表示第一组数据的第二个数据点,14表示该数据点的值。

public Vector readData(String s)

{

Vector tempVector = new Vector();

Float param;

String tempData = null;

boolean datapresent = true;

int i = 0;

while(datapresent)

{

try {

tempData = getParameter(s + "-" + (i+1));

}

catch(Exception e)

{

System.out.println(e);

}

if(tempData == null)

{

datapresent = false;

} else {

param = Float.valueOf(tempData);

tempVector.addElement(param);

i += 1;

}

}

return tempVector;

}

(5)消息循环

根据Windows编程经验,有用户界面就有消息循环,以组织消息处

理函数句柄对用户界面发出的消息进行响应。遗憾的是,在JDK 1.0中

,尚没有类似MFC中的消息映射表之类的东西组织消息循环。不过,Jav

a发展势头迅猛,不久的将来就会有公司将它实现!现在,我们需要自己

来组织它:Applet类有一个action方法,在其中可以通过if...then语

句来对不同的消息进行响应。

public boolean action(Event e, Object o)

{

Vector actionVector = new Vector();

String actionString = new String();

if(e.target instanceof Checkbox)

{

file://"数据1"发出的消息

if(cbg.getCurrent() == cb1)

{

actionVector = readData("1");

actionString = readStringData("1");

System.out.println("1");

}

file://数据2发出的消息

if(cbg.getCurrent() == cb2)

{

actionVector = readData("2");

actionString = readStringData("2");

}

file://数据3发出的消息

if(cbg.getCurrent() == cb3)

{

actionVector = readData("3");

actionString = readStringData("3");

}

int count = ac

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有