亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

在網頁上發布統計曲線

2019-11-17 06:27:20
字體:
來源:轉載
供稿:網友


一、引言

  在熙熙攘攘的Internet上制作極富個性化的主頁、及時發布令人心動的信息
,以便吸引全世界不同膚色、不同職業的人們駐"足"觀看,以致流連忘返,甚者慷慨
解囊,是Internet沖浪者心中的夢想。通過合理運用Html腳本語言提供的表格、列
表、字體和段落的格式化、多媒體支持等,能使網頁內容清楚、層次分明、可讀性
強,這些已有眾多文獻論述,在此不再贅述。

  我們知道,在各種信息中,統計信息堪稱是用得較多、具有相當說服力的信息
,而表達統計數據最直觀的方式是根據這些數據繪制曲線。文獻[1]用相當的篇幅
介紹了如何在Windows操作系統中編寫一個具有OLE服務器能力的統計曲線繪制工
具,而本文的主題則是:如何利用java對繪圖的支持,編寫一個根據統計數據繪制曲
線的小程序(Applet)Plot,通過把Plot編譯生成的字節碼文件Plot.class嵌入到H
TML腳本中,從而實現在網頁上發布統計曲線的目的。

  二、Java編程概述

  1.Java語言規范

  Java繼續了C++的基本語法,摒棄了一些過時的特征,比如預編譯的頭文件、宏
、條件編譯,數據結構的結構體、枚舉體和聯合體,輕易導致安全性問題的指針,以
及晦澀難懂的多重繼續等,借鑒了Objective C的接口和Ada的包(package),以及內
置了Internet網絡所需要的基本特征:結構中立(任何芯片、任何操作系統可以運
行同一版本的Java程序)、安全性(避免感染病毒和防止非法訪問)、多線程和網絡
通信等。事實上,上述被Java拋棄的特征,如指針和類的多重繼續,都是由于太復雜
而遭C++程序員詛咒的;而新發展的特征,如結構中立、安全性、多線程和網絡通信
等,是C++程序員極想實現而又非常難實現的特征。

  2.JDK

  Windows程序員一定都知道做Windows開發要用Windows SDK(軟件開發工具),
現在,做Ja va開發的程序員也都知道編寫Java小程序要用JDK(Java開發工具)了。
然而,與SDK主要采用結構體和函數等面向過程的方式提供Windows編程接口不同,
JDK采用包、界面和類等面向對象的方式提供Java編程接口。從這種意義上說,JD
K與Microsoft Visual C++的MFC,或者Bor land C++的OWL相似:它是一個類庫,一
個應用框架,一個無縫集成的解決方案。

  最先發布的JDK應該算JDK 1.0.3α,它是1995年Sun公司在全球范圍內進行Ja
va程序設計大獎賽時隨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.peer 、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在java.awt包中通過Graphics類來提供了對各種繪圖
設備的設備環境的抽象類封裝。用Window s編程來作對照,Graphics所代表的概念
就是Windows GDI的設備環境(Device Context),也就是MFC中CDC類或OWL的TDc類
。有了這樣的比較,對Graphics就比較好理解了。也就是,所有繪制直線、矩形、
橢圓、多邊形、設置字體、繪制文本等操作,調用Graphics類中的相應方法即可。
下面代碼是通過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程序不一樣的是,不管包含派生于Appl
et類的源程序文件( .java)命名為什么,生成的供網頁使用的字節碼文件(.class
)只與該派生類同名,而與源文件名無關,這一點輕易引起混淆。打個比方,假如包
含Plot類的文件為PlotTest.java,而編譯生成的字節碼文件名為Plot.class,而不
是PlotTest.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.a
wt包中包含了流布局治理器(FlowLayout)、邊界布局治理器(BorderLayout)、卡
片布局治理器(CardLayout)、網格布局治理器(GridLayout)和網格包布局治理器
(GridBagLayout)5個布局治理器。假如希望3 個單選框按鈕放在繪制圖形的下面
按一行排列,該如何編寫代碼呢?可以這樣來實現:首先設置Plot小程序為邊界布局
,然后為3個單選框按鈕創建一個Panel對象cbPanel,用于組織3個控件,并設置cbP
anel為網格布局,最后將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讀取這些參數,然后才開始顯示標題和繪制
統計曲線。其中,讀取統計標題和統計數據分別實現。

  ①統計標題,其格式可以是:
    <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;
}

 ?、诮y計數據,格式可以是:
    <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中的消息映射
表之類的東西組織消息循環。不過,Java發展勢頭迅猛,不久的將來就會有公司將
它實現!現在,我們需要自己來組織它: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 = actionVector.size();
c.clearHashMarks();
c.clearScreen();
c.drawAxes(curveWidth, curveHeight);
c.makeHashMarks(count);
c.showData(actionVector);
c.makeTitle(actionString);
repaint();
return true;
}
return false;
}   

  3.HTML文檔和程序演示

  下面列出了一個HTML實例,用于觀察上述編制的小程序,結果參見附圖。

<html><body><center>
<applet code="Plot.class" width = 350 height = 200>
<param name="1-DESC" value="每月訪問者統計">
<param name="1-1" value="10">
<param name="1-2" value="4">
<param name="1-3" value="17">
<param name="1-4" value="24">
<param name="1-5" value="9">
<param name="1-6" value="7">
<param name="1-7" value="30">
<param name="2-DESC" value="每年訪問者統計">
<param name="2-1" value="17">
<param name="2-2" value="13">
<param name="3-DESC" value="一次購買稅統計">
<param name="3-1" value="10000">
<param name="3-2" value="130000">
<param name="3-3" value="16100">
<param name="3-4" value="14000">
</applet></center></body>
<address><IMG SRC="/image/Li Zhenwen.jpg">
Li Zhenwen, Zhenwen@Websoft.com
</address></html>  



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久在线免费视频| 亚洲福利视频网| 91成人福利在线| 亚洲级视频在线观看免费1级| 国产精品最新在线观看| 91亚洲精品久久久久久久久久久久| 自拍偷拍亚洲区| 国产精品无av码在线观看| 91av视频在线| 九九视频直播综合网| 国产日韩在线视频| 最近的2019中文字幕免费一页| 国产精品视频一区二区高潮| 久久久亚洲精品视频| 亚洲free性xxxx护士hd| 日韩视频免费在线| 中文字幕日韩欧美精品在线观看| 精品久久久久久中文字幕一区奶水| 久久精品国产2020观看福利| 69av视频在线播放| 亚洲自拍高清视频网站| 亚洲精品久久7777777| 深夜成人在线观看| 在线电影欧美日韩一区二区私密| 欧美激情亚洲综合一区| 成人疯狂猛交xxx| 精品国产电影一区| 亚洲xxxx视频| 91精品免费看| 美女av一区二区三区| 国产一区二区成人| 亚洲视频网站在线观看| 国产91色在线|| 久久久久久97| 亚洲欧洲国产伦综合| 久久久在线视频| 欧美一级电影在线| 欧美精品在线视频观看| 国产偷国产偷亚洲清高网站| 91精品国产综合久久久久久久久| 欧美韩日一区二区| 亚州成人av在线| 色婷婷成人综合| 精品无人国产偷自产在线| 国产一区二区美女视频| 亚洲国产成人91精品| 高跟丝袜欧美一区| 国内精品久久久久伊人av| 日韩一区二区欧美| 91久久久久久国产精品| 国产一区欧美二区三区| 亚洲精品v欧美精品v日韩精品| 精品久久久视频| 亚洲电影免费观看高清完整版| 欧美日韩在线免费| 欧美怡红院视频一区二区三区| 一本一本久久a久久精品牛牛影视| 国产精品女人网站| 色妞一区二区三区| 日韩电影在线观看免费| 久久91精品国产91久久久| 91精品国产777在线观看| 色无极影院亚洲| 亚洲深夜福利网站| 日韩av大片在线| 亚洲美女av在线播放| 欧美黑人又粗大| 亚洲综合中文字幕在线| 国产精品网站视频| 久久久久久91| 伊人亚洲福利一区二区三区| 91精品综合久久久久久五月天| 欧美电影第一页| 欧美精品午夜视频| 在线播放日韩欧美| 欧美肥臀大乳一区二区免费视频| 国产福利精品在线| 欧美在线精品免播放器视频| 欧美亚洲视频在线观看| 久久深夜福利免费观看| 久久国产色av| 久久久久成人精品| 亚洲精品成a人在线观看| 97人人模人人爽人人喊中文字| 欧美激情xxxx性bbbb| 久久99视频免费| 久久久亚洲天堂| 18一19gay欧美视频网站| 亚洲激情视频在线播放| 欧美性猛交丰臀xxxxx网站| 欧美激情亚洲国产| 黑人巨大精品欧美一区二区一视频| 国产女人精品视频| 亚洲天堂av网| 亚洲国产精品999| 九九热最新视频//这里只有精品| 亚洲免费影视第一页| 中文字幕av一区中文字幕天堂| 这里只有精品在线观看| 日本国产高清不卡| 中国日韩欧美久久久久久久久| 欧美中文字幕在线播放| 中文字幕日韩av| 亚洲白虎美女被爆操| 欧美激情va永久在线播放| 久久99亚洲热视| 亚洲激情小视频| 欧美亚洲激情在线| 久热精品视频在线免费观看| 欧美老女人xx| 日韩精品免费电影| 国产91精品久久久久| 欧美综合激情网| 国产一区二区三区欧美| 性亚洲最疯狂xxxx高清| 国内精品美女av在线播放| 亚洲国内精品在线| 欧美日韩国产成人在线观看| 日韩在线欧美在线| 自拍偷拍亚洲精品| 日本乱人伦a精品| 伊人久久大香线蕉av一区二区| 中文字幕久热精品在线视频| 久久精品视频va| 亚洲欧洲av一区二区| 日韩高清有码在线| 亚洲欧美精品伊人久久| 久久久久久久影视| 国产精品美女久久久免费| 欧洲成人在线观看| 亚洲精品黄网在线观看| 97视频在线播放| 97视频在线观看视频免费视频| 欧美精品www| 亚洲另类图片色| 久久手机免费视频| 国产精品麻豆va在线播放| 在线国产精品视频| 欧美精品制服第一页| 欧美理论电影在线观看| 亚洲精品白浆高清久久久久久| 91精品国产高清自在线| 国产不卡视频在线| 91香蕉嫩草影院入口| 日韩中文视频免费在线观看| 久久精品国产久精国产思思| 91中文精品字幕在线视频| 一区二区国产精品视频| 国产精品久久久久不卡| 国产精品美女久久久久久免费| 久久久在线观看| 欧美野外猛男的大粗鳮| 欧美成人精品激情在线观看| 国产裸体写真av一区二区| 国产亚洲精品激情久久| 91在线视频成人| 91精品国产高清久久久久久| 日本亚洲欧美三级| 欧美日韩国产中文精品字幕自在自线| 欧美精品免费在线| 欧美情侣性视频| 国产精品日韩在线| 欧美极品美女电影一区| 日韩精品视频在线观看网址|