在網頁上釋出統計曲線 (轉)

worldblog發表於2007-12-04
在網頁上釋出統計曲線 (轉)[@more@]

  一、引言
  在 寥戀腎nte上製作極富個性化的主頁、及時釋出令人
心動的資訊,以便吸引全世界不同膚色、不同職業的人們駐"足"觀看,
以致流連忘返,甚者慷慨解囊,是Internet衝浪者心中的夢想。透過合
理運用HTML指令碼語言提供的表格、列表、字型和段落的格式化、多媒
體支援等,能使網頁內容清晰、層次分明、可讀性強,這些已有眾多文
獻論述,在此不再贅述。
  我們知道,在各種資訊中,統計資訊堪稱是用得較多、具有相當說
服力的資訊,而表達統計資料最直觀的方式是根據這些資料繪製曲線
。文獻[1]用相當的篇幅介紹瞭如何在Window s操作中編寫一個
具有OLE能力的統計曲線繪製工具,而本文的主題則是:如何利
用對繪圖的支援,編寫一個根據統計資料繪製曲線的小(Appl
et)Plot,透過把Plot編譯生成的位元組碼Plot.class嵌入到HTML腳
本中,從而實現在網頁上釋出統計曲線的目的。
  二、Java概述
  1.Java語言規範
  Java繼承了C++的基本語法,摒棄了一些過時的特徵,比如預編譯
的標頭檔案、宏、條件編譯,資料結構的結構體、列舉體和聯合體,容易
導致性問題的指標,以及晦澀難懂的多重繼承等,借鑑了iv
e C的介面和Ada的包(package),以及內建了Internet所需要的基
本特徵:結構中立(任何、任何可以執行同一版本的Java
程式)、安全性(避免感染和防止訪問)、多執行緒和網路通訊
等。事實上,上述被Java拋棄的特徵,如指標和類的多重繼承,都是由
於太複雜而遭C++程式設計師詛咒的;而新發展的特徵,如結構中立、安全
性、多執行緒和網路通訊等,是C++程式設計師極想實現而又非常難實現的特
徵。
  2.
  程式設計師一定都知道做Windows開發要用Windows SDK(
開發工具),現在,做Ja va開發的程式設計師也都知道編寫Java小程式要用
JDK(Java開發工具)了。然而,與SDK主要採用結構體和等面向過
程的方式提供Windows程式設計介面不同,JDK採用包、介面和類等面向對
象的方式提供Java程式設計介面。從這種意義上說,JDK與 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.de。本文的程式基於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、和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;
  定Vector中的最大值。
  for(int i = 0; i < v.size(); i++)
  {
  float temp = ((Float)v.elementAt(i)).floatValue();
  if(temp > maxY)
  {
  maxY = temp;
  }
  }
  定第一個資料點的X座標。
  xPoint = xOrigin + (xSpacing/2);
  int oldX = 0;
  int oldY = 0;
  資料點處繪製一個小圓圈。
  for(int j = 0; j < v.size(); j++)
  {
  yPoint = yOrigin(int)((axisH/maxY) *
  ((Float)v.elementAt(j)).floatValue());
  myGC.fillRect(xPoint, yPoint, 3, 3);
  資料點之間聯線。
  if((oldX != 0) && (oldY != 0))
  {
  myGC.drawLine(oldX-xSpacing, oldY, xPoint, yPoint)
;
  }
  myGC.setColor(Color.blue);
  資料點邊上寫出資料值。
  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();
  選按鈕。
  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)和網格包佈局管理器(GriagLayout)5個
佈局管理器。如果希望3 個單選框按鈕放在繪製圖形的下面按一行排
列,該如何編寫程式碼呢?可以這樣來實現:首先設定Plot小程式為邊界
佈局,然後為3個單選框按鈕建立一個Panel物件cbPanel,用於組織3個
控制元件,並設定cbPanel為網格佈局,最後將cbPanel新增到Plot類中,並
設定其方向為南(South)。
  public void init()
  {
  ......
  置Plot為邊界佈局。
  setLayout(new BorderLayout());
  3個控制元件申請皮膚物件cbPanel。
  cbPanel = new Panel();
  置網格佈局管理器,並按1×3方式排列。
  cbPanel.setLayout(new GridLayout(1, 3));
  各按鈕申請1個皮膚。
  cb1Panel = new Panel();
  cb1Panel.add(cb1);
  cb2Panel = new Panel();
  cb2Panel.add(cb2);
  cb3Panel = new Panel();
  cb3Panel.add(cb3);
  加到統一的1個皮膚cbPanel中。
  cbPanel.add(cb1Panel);
  cbPanel.add(cb2Panel);
  cbPanel.add(cb3Panel);
  加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)
  {
  據1"發出的訊息
  if(cbg.getCurrent() == cb1)
  {
  actionVector = readData("1");
  actionString = readStringData("1");
  System.out.println("1");
  }
  據2發出的訊息
  if(cbg.getCurrent() == cb2)
  {
  actionVector = readData("2");
  actionString = readStringData("2");
  }
  據3發出的訊息
  if(cbg.getCurrent() == cb3)
  {
  actionVector = readData("3");
  actionString = readStringData("3");
  }
  int count = ac

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-988044/,如需轉載,請註明出處,否則將追究法律責任。

相關文章