用Java繪制K線 (轉(zhuǎn))
發(fā)表時(shí)間:2024-02-06 來(lái)源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]用Java繪制K線 黑龍江省牡丹江王哲 ---- Java語(yǔ)言中的Applet(Java小程序)和Application(Java應(yīng)用程序)是在結(jié)構(gòu)和功能上都存在很大差異的兩種不同的編程方式。Applet應(yīng)用于Web頁(yè)上,可做出多姿多彩的頁(yè)面特效,給網(wǎng)站增輝添色;Application則與其他編程...
用Java繪制K線
黑龍江省牡丹江王哲
---- Java語(yǔ)言中的Applet(Java小程序)和Application(Java應(yīng)用程序)是在結(jié)構(gòu)和功能上都存在很大差異的兩種不同的編程方式。Applet應(yīng)用于Web頁(yè)上,可做出多姿多彩的頁(yè)面特效,給網(wǎng)站增輝添色;Application則與其他編程語(yǔ)言(如VB、VC)一樣,可編制各種應(yīng)用程序。
---- 本文要討論的是第一種情況,在Web頁(yè)上用Java Applet繪制K線圖。
---- K線是股市行情分析中的一種參數(shù)指標(biāo),用股票每日的開盤價(jià)、最高價(jià)、最低價(jià)、收盤價(jià)及成交量等數(shù)據(jù)進(jìn)行作圖,配合五日、十日均線便可反映出一個(gè)階段內(nèi)該支股票的漲跌走勢(shì)。
---- Java Applet所做的K線圖多應(yīng)用于證券類型的網(wǎng)站,以方便網(wǎng)上股民的分析操作。不過(guò)由于我國(guó)網(wǎng)速的關(guān)系,目前有些證券類網(wǎng)站把K線圖做成了圖片以節(jié)省下載的時(shí)間。當(dāng)然,其繪制K線所用的工具(Java Applet)及繪制方法還是相同的。
---- 在編寫繪制K線的Java Applet時(shí),有幾處關(guān)鍵問(wèn)題要解決,即:1)多線程的使用;2)布局管理器的選擇;3)數(shù)據(jù)輸入、輸出流的應(yīng)用;4)設(shè)置、監(jiān)聽(tīng)鼠標(biāo)與鍵盤事件。
---- 下面通過(guò)一個(gè)實(shí)例,來(lái)詳細(xì)闡述整個(gè)編程過(guò)程和方法。
---- 一、使用多線程
---- 一個(gè)完整的Java Applet包含四個(gè)方法,Init()、Start()、Stop()、Destroy()(即:初始化、開始、停止、清除),構(gòu)成一個(gè)完整的生命周期,其運(yùn)行次序也是由上而下順序執(zhí)行。
---- 在繪制K線圖的過(guò)程中,除了要繪制窗體及代表股票升降的陰線、陽(yáng)線矩形外,還要監(jiān)聽(tīng)鼠標(biāo)事件并同時(shí)繪制一個(gè)自由移動(dòng)的“十字”游標(biāo),來(lái)定位顯示所檢索股票每日的各種價(jià)格數(shù)值(如開盤價(jià)、收盤價(jià)等);這時(shí),為了避免閃爍和減少重新計(jì)算的等待時(shí)間,除了重繪跟隨鼠標(biāo)移動(dòng)的“十字”游標(biāo)外,對(duì)頁(yè)面的布局及陰線、陽(yáng)線矩形等不進(jìn)行重繪;這就需要應(yīng)用多線程來(lái)完成該項(xiàng)任務(wù)。
---- 1.關(guān)于多線程的一些基本概念:
---- 多線程實(shí)際上就是啟動(dòng)另一個(gè)進(jìn)程,其運(yùn)行的過(guò)程獨(dú)立于主程序之外,并從主程序的Start()方法載入、由Run()方法調(diào)用執(zhí)行。實(shí)現(xiàn)多線程的方法有兩種,即:創(chuàng)建Thread類的子類(類的繼承)和實(shí)現(xiàn)runnable接口。
---- 為便于使用,Java把所有有關(guān)線程的功能封裝成Java類庫(kù)中的一個(gè)類:Java.lang.Thread。通過(guò)這個(gè)類,Java可以創(chuàng)建、控制和終止線程,完成有關(guān)多線程的所有操作。
---- 在Java語(yǔ)言中,一個(gè)子類只能繼承一個(gè)超類(父類),由于我們所要編寫的Java Applet是應(yīng)用于網(wǎng)頁(yè)中的,首先必須繼承瀏覽器類(java.applet);因此,在本例中我們通過(guò)實(shí)現(xiàn)runnable接口的方法來(lái)實(shí)現(xiàn)多線程,實(shí)現(xiàn)的語(yǔ)句如下:
---- public class StockApplet extends java.applet.Applet implements Runnable
---- 2.多線程的應(yīng)用:
---- 首先,在Init()方法中對(duì)要?jiǎng)?chuàng)建的線程(M_pointThread)進(jìn)行定義及初始化:
Thread M_pointThread=null;
---- 然后,在Start()和Stop()方法中加入以下代碼:
---- //當(dāng)打開瀏覽器頁(yè)面開始載入Java Applet代碼時(shí),執(zhí)行start()方法
public void start()
{
if (M_pointThread==null) //如果線程尚未產(chǎn)生
{
M_pointThread=new Thread(this);//則創(chuàng)建一個(gè)新線程
M_pointThread.start(); //啟動(dòng)該線程
}
}
//在當(dāng)前頁(yè)面關(guān)閉或轉(zhuǎn)向其他Web頁(yè)面時(shí),
調(diào)用stop()方法,以釋放系統(tǒng)資源
public void stop()
{
if (M_pointThread!=null)
//如果線程尚在運(yùn)行
{
M_pointThread.stop();
//停止該線程
M_pointThread=null;
//釋放線程所占資源
}
}
---- 3.編寫線程運(yùn)行的代碼:
public void run()
{
M_graphics=getGraphics();
M_graphics.setXORMode(Color.white);
//采用異或方法繪制“十字”游標(biāo)
while(true)
{
try
{
if(MouseMove==true) //偵測(cè)到鼠標(biāo)的移動(dòng)后,
執(zhí)行以下代碼
{ //當(dāng)鼠標(biāo)位于以下區(qū)域(Java Applet布局)
內(nèi)時(shí),執(zhí)行畫線操作
if(x0 >50 && x0< 600){M_graphics.drawLine
(x0,30,x0,380);}
if(y0 >30 && y0 <380){M_graphics.drawLine
(50,y0,600,y0);}
if(X >50 && X< 600){M_graphics.drawLine
(X,30,X,380);}
if(Y >30 && Y< 380){M_graphics.drawLine
(50,Y,600,Y);}
MouseMove=fase;
x0=X; //傳遞當(dāng)前座標(biāo)參數(shù)
y0=Y;
}
}catch(NullPointerException npe){}
//捕獲可能出現(xiàn)的異常
}
---- 二、布局管理器
---- 本例中的Java Applet運(yùn)行時(shí),要在頁(yè)面上Java Applet的運(yùn)行區(qū)域內(nèi)繪制相應(yīng)的“標(biāo)簽”來(lái)顯示不同的數(shù)值,并要加入一個(gè)“文本框”來(lái)接收輸入的股票代碼。對(duì)這些“標(biāo)簽”和“文本框”位置及大小的設(shè)定,便屬于布局管理的應(yīng)用范疇。
---- Java語(yǔ)言中提供的布局管理器種類有:邊界式布局、卡片式布局、流式布局和網(wǎng)格式布局等,各有不同的特點(diǎn),可根據(jù)實(shí)際需要選用;但有最大自由設(shè)計(jì)空間的是“無(wú)布局管理器”——即不使用任何布局格式,而通過(guò)手工方式添加組件到頁(yè)面布局的絕對(duì)位置上。本例中使用的便是“無(wú)布局管理器”。
---- 在使用“無(wú)布局管理器”時(shí),首先要作出聲明,即:
setLayout(null);
然后用reshape()方法指定組件的具體位置和尺寸,
基本語(yǔ)句如下所示:
Label label1=new Label();
//定義標(biāo)簽
this.add(label1);
//把標(biāo)簽加入布局管理器
label1.reshape(10,10,30,30);
//在指定位置繪制標(biāo)簽
---- 對(duì)于多個(gè)標(biāo)簽和文本框,參照此格式添加即可。
---- 三、輸入、輸出數(shù)據(jù)流
---- Java Applet在客戶端瀏覽器上運(yùn)行時(shí),要從服務(wù)器端讀取股票的相關(guān)數(shù)據(jù)進(jìn)行做圖,這就涉及到Java數(shù)據(jù)流的運(yùn)用。
---- Java.io包提供了多個(gè)用于與各種I/O設(shè)備交換信息的類,其最頂層的兩個(gè)類便是輸入流類(InputStream)和輸出流類(OutputStream)。
---- 為了便于實(shí)現(xiàn),在本例中我們先在服務(wù)器端把股票數(shù)據(jù)庫(kù)(如:show128.dbf)中的有關(guān)字段寫入一文本文件中(其格式為:第一行為股票的漢字名稱,以后每一行內(nèi)包括:開盤日期、開盤價(jià)、最高價(jià)、最低價(jià)、收盤價(jià)、成交量),并以該支股票的代碼作為文件名(如:600001.txt);然后,再用Java Applet從服務(wù)器端的文本文件中讀取數(shù)據(jù)。這樣,就把對(duì)服務(wù)器端數(shù)據(jù)庫(kù)的訪問(wèn)轉(zhuǎn)化為對(duì)文件的I/O操作,實(shí)現(xiàn)的語(yǔ)句如下:
URL urlc=new URL("http://127.0.0.1/temp
/"+FileName+".txt");
BufferedReader
bis=new BufferedReader
(new InputStreamReader(urlc.openStream()));
---- 注:第一條語(yǔ)句中的http://127.0.0.1/temp/ 為在本機(jī)執(zhí)行調(diào)試操作的URL地址,在上傳到服務(wù)器上后要做相應(yīng)的修改;FileName為要讀取的文本文件名。
---- 第二條語(yǔ)句定義了讀取輸入數(shù)據(jù)流的方法。
---- 四、監(jiān)聽(tīng)鍵盤及鼠標(biāo)事件
---- 在Java Applet小程序中,單擊按鈕、鍵入文本、使用鼠標(biāo)或執(zhí)行任何與界面相關(guān)的動(dòng)作時(shí),就發(fā)生一個(gè)事件,小程序就會(huì)作出適當(dāng)?shù)姆磻?yīng)。
---- 在本例中,我們通過(guò)使用action()方法來(lái)獲得Java Applet小程序運(yùn)行時(shí)所發(fā)生的事件。語(yǔ)句格式如下:
public boolean action(Event evt,Object arg)
{
FileName=text1.getText();
//提取文本框中輸入的參數(shù)
ReadData();
//調(diào)用讀數(shù)據(jù)流數(shù)據(jù)的方法
return true;
//處理完畢,不需要其他方法再做處理
}
---- 上面的action()方法中含有兩個(gè)參數(shù):一個(gè)是Event類的一個(gè)對(duì)象evt;另一個(gè)是Object類的一個(gè)對(duì)象arg。Event對(duì)象告訴我們發(fā)生了哪種事件,而Object對(duì)象將進(jìn)一步告訴我們有關(guān)該事件的情況。每當(dāng)有Event監(jiān)聽(tīng)的事件發(fā)生時(shí),Java Applet便自動(dòng)調(diào)用該action()方法。
---- 至此,在掌握了上述編程中的一些要點(diǎn)后,我們便可以成功地編制出一個(gè)完整的繪制K線的Java Applet小程序了(完整的源代碼附后)。
---- 五、編制HTML文檔(Stock.html)
---- 程序編制完成后,另外要做的是設(shè)置在Web頁(yè)面上調(diào)用Java Applet的頁(yè)面,即編制HTML文檔。Stock.html文檔的示例代碼如下:
< HTML >< HEAD >< TITLE >股票K線圖< /TITLE >< /HEAD >
< body bgcolor=#00ffff >
< APPLET
code=StockApplet.class codeBase=C:\javatemp\Project1\
name=StockApplet
style="FONT-FAMILY: sans-serif;
HEIGHT: 410px; WIDTH: 610px">
< /APPLET >
< /body >
< /HTML >
---- 在< APPLET >< /APPLET >標(biāo)簽對(duì)內(nèi),是對(duì)Java Applet小程序的調(diào)用代碼。其中的StockApplet.class是經(jīng)編譯后生成的class文件,codeBase指向的是class文件所存放的路徑。如果class文件與HTML文檔存放在同一目錄下,則可以省略這一項(xiàng)。
---- 至此,編制Java Applet小程序的工作便全部完成。
---- 在個(gè)人計(jì)算機(jī)上進(jìn)行調(diào)試時(shí),首先要安裝個(gè)人Web服務(wù),然后,把StockApplet.class與HTML文檔一起拷貝到本機(jī)的WWW服務(wù)目錄下(如:C:\Inetpub\wwwroot\),打開瀏覽器,在地址欄內(nèi)輸入http://127.0.0.1/Stock.html,回車,進(jìn)行測(cè)試操作(注意:此時(shí)要在Stock.html文檔中刪除codeBase一項(xiàng),否則會(huì)產(chǎn)生class文件未找到的錯(cuò)誤)。
---- 調(diào)試通過(guò)后,便可上傳至服務(wù)器投入運(yùn)行了。