在網頁上釋出統計曲線 (轉)
一、引言
在 寥戀腎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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- vue 釋出網頁Vue網頁
- 庫克曲線(轉載)
- Adobe釋出網頁設計軟體Muse網頁
- 座標曲線的程式設計實現 (轉)程式設計
- qGPU 容器產品全量上線,重磅釋出 GPU 在離線混部功能GPU
- rhino 的擠出曲線命令
- 在網頁中調出QQ網頁
- flutter 自定義view 繪製曲線統計圖FlutterView
- 在網頁中使用MediaPlayer (轉)網頁
- 在 NEO 上釋出代幣合約
- 我的文章會在掘金上釋出
- 在網頁中實現細線邊框的兩種方法(轉)網頁
- 超酷!在網頁上線上體驗Ubuntu網頁Ubuntu
- 在Linux上安裝ORiNOCO無線網路卡辦法(轉)Linux
- 3.2.1.0 釋出!時間轉換函式+BI 整合+檢視正式上線!函式
- opencv計算曲線長度OpenCV
- 蘋果釋出全新Siri網頁 系統介紹語音助手功能蘋果網頁
- 在MVC中實現 網頁錯誤跳轉到500統一頁面MVC網頁
- 庫克創造力曲線(轉載)
- Win10系統重大特性曝光:網頁也上時間線功能Win10網頁
- 在 NEO 上使用智慧合約釋出 NFT
- Excel做網頁 學生成績網上查(轉)Excel網頁
- 在阿里雲上單機使用Nginx負載均衡釋出網站阿里Nginx負載網站
- 橢圓曲線加法原理計算
- 重磅釋出|騰訊雲容器安全服務網路隔離功能已上線
- 在網頁設計中如何排版網頁
- 在網頁中怎樣使文字旋轉? (轉)網頁
- 機器學習中的PR曲線和ROC曲線機器學習
- 在 Web 頁上使用條件數值格式 (轉)Web
- 世界首個網際網路網頁上線25週年了網頁
- 無線通訊在智慧公交系統上的設計應用
- canvas進階——如何畫出平滑的曲線?Canvas
- Language Server for Java™ 1.0 在VS Code上正式釋出!ServerJava
- 從網頁上發訊息給ICQ (轉)網頁
- 用模板和庫批次修改網頁(上) (轉)網頁
- 有沒有類似上線釋出管理的工具
- ? 「掘金官方」關注的人釋出的文章上線啦!
- Spring Authorization Server 0.3.0 釋出,官方文件正式上線SpringServer