热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

在网页上发布统计曲线(转)

在网页上发布统计曲线(转)[more]一、引言在寥恋腎nte.NET上制作极富个性化的主页、及时发布令人心动的信息,以便吸引全世界不同肤色、不同职业的人们驻足观看,以致流连忘返
在网页上发布统计曲线 (转)[@more@]

  一、引言
  在 寥恋腎nte.NET上制作极富个性化的主页、及时发布令人
心动的信息,以便吸引全世界不同肤色、不同职业的人们驻"足"观看,
以致流连忘返,甚者慷慨解囊,是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   {
  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   {
  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读取这些参数,然
后才开始显示标题和绘制统计曲线。其中,读取统计标题和统计数据
分别实现。
  ①统计标题,其格式可以是:
 
  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;
  }
  ②统计数据,格式可以是:
 
  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

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10752043/viewspace-988044/,如需转载,请注明出处,否则将追究法律责任。

转:http://blog.itpub.net/10752043/viewspace-988044/



推荐阅读
  • 机器学习核心概念与技术
    本文系统梳理了机器学习的关键知识点,涵盖模型评估、正则化、线性模型、支持向量机、决策树及集成学习等内容,并深入探讨了各算法的原理和应用场景。 ... [详细]
  • 深入解析Java虚拟机(JVM)架构与原理
    本文旨在为读者提供对Java虚拟机(JVM)的全面理解,涵盖其主要组成部分、工作原理及其在不同平台上的实现。通过详细探讨JVM的结构和内部机制,帮助开发者更好地掌握Java编程的核心技术。 ... [详细]
  • 深入理解Java多线程并发处理:基础与实践
    本文探讨了Java中的多线程并发处理机制,从基本概念到实际应用,帮助读者全面理解并掌握多线程编程技巧。通过实例解析和理论阐述,确保初学者也能轻松入门。 ... [详细]
  • 本文档汇总了Python编程的基础与高级面试题目,涵盖语言特性、数据结构、算法以及Web开发等多个方面,旨在帮助开发者全面掌握Python核心知识。 ... [详细]
  • 深入解析SpringMVC核心组件:DispatcherServlet的工作原理
    本文详细探讨了SpringMVC的核心组件——DispatcherServlet的运作机制,旨在帮助有一定Java和Spring基础的开发人员理解HTTP请求是如何被映射到Controller并执行的。文章将解答以下问题:1. HTTP请求如何映射到Controller;2. Controller是如何被执行的。 ... [详细]
  • 在编译BSP包过程中,遇到了一个与 'gets' 函数相关的编译错误。该问题通常发生在较新的编译环境中,由于 'gets' 函数已被弃用并视为安全漏洞。本文将详细介绍如何通过修改源代码和配置文件来解决这一问题。 ... [详细]
  • 深入解析 Android IPC 中的 Messenger 机制
    本文详细介绍了 Android 中基于消息传递的进程间通信(IPC)机制——Messenger。通过实例和源码分析,帮助开发者更好地理解和使用这一高效的通信工具。 ... [详细]
  • Linux环境下进程间通信:深入解析信号机制
    本文详细探讨了Linux系统中信号的生命周期,从信号生成到处理函数执行完毕的全过程,并介绍了信号编程中的注意事项和常见应用实例。通过分析信号在进程中的注册、注销及处理过程,帮助读者理解如何高效利用信号进行进程间通信。 ... [详细]
  • 深入解析Java多线程与并发库的应用:空中网实习生面试题详解
    本文详细探讨了Java多线程与并发库的高级应用,结合空中网在挑选实习生时的面试题目,深入分析了相关技术要点和实现细节。文章通过具体的代码示例展示了如何使用Semaphore和SynchronousQueue来管理线程同步和任务调度。 ... [详细]
  • 2017-2018年度《网络编程与安全》第五次实验报告
    本报告详细记录了2017-2018学年《网络编程与安全》课程第五次实验的具体内容、实验过程、遇到的问题及解决方案。 ... [详细]
  • Logback使用小结
    1一定要使用slf4j的jar包,不要使用apachecommons的jar。否则滚动生成文件不生效,不滚动的时候却生效~~importorg.slf ... [详细]
  • 本文介绍了如何使用Java代码在Android设备上检测特定应用程序是否已安装。通过创建一个Intent并利用PackageManager查询该Intent的可用性来实现这一功能。 ... [详细]
  • Java多线程实现:从1到100分段求和并汇总结果
    本文介绍如何使用Java编写一个程序,通过10个线程分别计算不同区间的和,并最终汇总所有线程的结果。每个线程负责计算一段连续的整数之和,最后将所有线程的结果相加。 ... [详细]
  • ListView简单使用
    先上效果:主要实现了Listview的绑定和点击事件。项目资源结构如下:先创建一个动物类,用来装载数据:Animal类如下:packagecom.example.simplelis ... [详细]
  • 本文详细探讨了Java中的ClassLoader类加载器的工作原理,包括其如何将class文件加载至JVM中,以及JVM启动时的动态加载策略。文章还介绍了JVM内置的三种类加载器及其工作方式,并解释了类加载器的继承关系和双亲委托机制。 ... [详细]
author-avatar
自娱自乐GoGo
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有