java编写k线_⽤Java绘制K线图
【IT168技术⽂档】
Java语⾔中的Applet(Java⼩程序)和Application(Java应⽤程序)是在结构和功能上都存在很⼤差异的两种不同的编程⽅式。Applet应⽤于Web页上,可做出多姿多彩的页⾯特效,给⽹站增辉添⾊;Application则与其他编程语⾔(如VB、VC)⼀样,可编制各种应⽤程序。
本⽂要讨论的是第⼀种情况,在Web页上⽤Java Applet绘制K线图。
K线是股市⾏情分析中的⼀种参数指标,⽤股票每⽇的开盘价、最⾼价、最低价、收盘价及成交量等数据进⾏作图,配合五⽇、⼗⽇均线便可反映出⼀个阶段内该⽀股票的涨跌⾛势。
Java Applet所做的K线图多应⽤于证券类型的⽹站,以⽅便⽹上股民的分析操作。不过由于我国⽹速的关系,⽬前有些证券类⽹站把K线图做成了图⽚以节省下载的时间。当然,其绘制K线所⽤的⼯具(Java Applet)及绘制⽅法还是相同的。
在编写绘制K线的Java Applet时,有⼏处关键问题要解决,即:1)多线程的使⽤;2)布局管理器的选择;3)数据输⼊、输出流的应⽤;4)设置、监听⿏标与键盘事件。
下⾯通过⼀个实例,来详细阐述整个编程过程和⽅法。
java怎么编写⼀、使⽤多线程
⼀个完整的Java Applet包含四个⽅法,Init()、Start()、Stop()、Destroy()(即:初始化、开始、停⽌、清除),构成⼀个完整的⽣命周期,其运⾏次序也是由上⽽下顺序执⾏。
在绘制K线图的过程中,除了要绘制窗体及代表股票升降的阴线、阳线矩形外,还要监听⿏标事件并同时绘制⼀个⾃由移动的“⼗字”游标,来定位显⽰所检索股票每⽇的各种价格数值(如开盘价、收盘价等);这时,为了避免闪烁和减少重新计算的等待时间,除了重绘跟随⿏标移动的“⼗字”游标外,对页⾯的布局及阴线、阳线矩形等不进⾏重绘;这就需要应⽤多线程来完成该项任务。
1.关于多线程的⼀些基本概念:
多线程实际上就是启动另⼀个进程,其运⾏的过程独⽴于主程序之外,并从主程序的Start()⽅法载⼊、由Run()⽅法调⽤执⾏。实现多线程的⽅法有两种,即:创建Thread类的⼦类(类的继承)和实现runnable接⼝。
为便于使⽤,Java把所有有关线程的功能封装成Java类库中的⼀个类:Java.lang.Thread。通过这个类,Java可以创建、控制和终⽌线程,完成有关多线程的所有操作。
在Java语⾔中,⼀个⼦类只能继承⼀个超类(⽗类),由于我们所要编写的Java Applet是应⽤于⽹页中
的,⾸先必须继承浏览器类
(java.applet);因此,在本例中我们通过实现runnable接⼝的⽅法来实现多线程,实现的语句如下:
public class StockApplet extends java.applet.Applet implements Runnable
2.多线程的应⽤:
⾸先,在Init()⽅法中对要创建的线程(M_pointThread)进⾏定义及初始化:
Thread M_pointThread=null;
然后,在Start()和Stop()⽅法中加⼊以下代码:
//当打开浏览器页⾯开始载⼊Java Applet代码时,执⾏start()⽅法
public void start()
{
if (M_pointThread==null) //如果线程尚未产⽣
{
M_pointThread=new Thread(this); //则创建⼀个新线程
M_pointThread.start(); //启动该线程
}
}
//在当前页⾯关闭或转向其他Web页⾯时,调⽤stop()⽅法,以释放系统资源
publicvoidstop()
{if(M_pointThread!=null)//如果线程尚在运⾏{
M_pointThread.stop();//停⽌该线程M_pointThread=null;//释放线程所占资源}
}
3.编写线程运⾏的代码:
publicvoidrun()
{
M_graphics=getGraphics();
M_graphics.setXORMode(Color.white);//采⽤异或⽅法绘制“⼗字”游标while(true)
{try{if(MouseMove==true)//侦测到⿏标的移动后,执⾏以下代码{//当⿏标位于以下区域(Java Applet布局)内时,执⾏画线操作
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;//传递当前座标参数y0=Y;
}
}catch(NullPointerException npe){}//捕获可能出现的异常}
⼆、布局管理器
本例中的Java Applet运⾏时,要在页⾯上Java Applet的运⾏区域内绘制相应的“标签”来显⽰不同的数值,并要加⼊⼀个“⽂本框”来接收输⼊的股票代码。对这些“标签”和“⽂本框”位置及⼤⼩的设定,便属于布局管理的应⽤范畴。
Java语⾔中提供的布局管理器种类有:边界式布局、卡⽚式布局、流式布局和⽹格式布局等,各有不同的特点,可根据实际需要选⽤;但有最⼤⾃由设计空间的是“⽆布局管理器”——即不使⽤任何布局格式,⽽通过⼿⼯⽅式添加组件到页⾯布局的绝对位置上。本例中使⽤的便是“⽆布局管理器”。
在使⽤“⽆布局管理器”时,⾸先要作出声明,即:
setLayout(null);
然后⽤reshape()⽅法指定组件的具体位置和尺⼨,
基本语句如下所⽰:
Label label1=new Label(); //定义标签
this.add(label1);  //把标签加⼊布局管理器
对于多个标签和⽂本框,参照此格式添加即可。
三、输⼊、输出数据流
Java Applet在客户端浏览器上运⾏时,要从服务器端读取股票的相关数据进⾏做图,这就涉及到Java数据流的运⽤。
Java.io包提供了多个⽤于与各种I/O设备交换信息的类,其最顶层的两个类便是输⼊流类(InputStream)和输出流类(OutputStream)。
为了便于实现,在本例中我们先在服务器端把股票数据库(如:show128.dbf)中的有关字段写⼊⼀⽂本⽂件中(其格式为:第⼀⾏为股票的汉字名称,以后每⼀⾏内包括:开盘⽇期、开盘价、最⾼价、最低价、收盘价、成交量),并以该⽀股票的代码作为⽂件名(如:
<);然后,再⽤Java Applet从服务器端的⽂本⽂件中读取数据。这样,就把对服务器端数据库的访问转化为对⽂件的I/O操作,实现的语句如下:
URL urlc=new URL("127.0.0.1/"+FileName+".txt");
BufferedReader bis=new BufferedReader(new InputStreamReader(urlc.openStream()));
第⼆条语句定义了读取输⼊数据流的⽅法。
四、监听键盘及⿏标事件
在Java Applet⼩程序中,单击按钮、键⼊⽂本、使⽤⿏标或执⾏任何与界⾯相关的动作时,就发⽣⼀个事件,⼩程序就会作出适当的反应。
在本例中,我们通过使⽤action()⽅法来获得Java Applet⼩程序运⾏时所发⽣的事件。语句格式如下:
publicboolean action(Event evt,Object arg)
{
Text();//提取⽂本框中输⼊的参数ReadData();//调⽤读数据流数据的⽅法returntrue;/
/处理完毕,不需要其他⽅法再做处理}
上⾯的action()⽅法中含有两个参数:⼀个是Event类的⼀个对象evt;另⼀个是Object类的⼀个对象arg。Event对象告诉我们发⽣了哪种事件,⽽Object对象将进⼀步告诉我们有关该事件的情况。每当有Event监听的事件发⽣时,Java Applet便⾃动调⽤该action()⽅法。
⾄此,在掌握了上述编程中的⼀些要点后,我们便可以成功地编制出⼀个完整的绘制K线的Java Applet⼩程序了(完整的源代码下载)。
五、编制HTML⽂档(Stock.html)
程序编制完成后,另外要做的是设置在Web页⾯上调⽤Java Applet的页⾯,即编制HTML⽂档。Stock.html⽂档的⽰例代码如下:
<HTML>
< HEAD >
< TITLE >股票K线图</TITLE >
</HEAD >
<body bgcolor=#00ffff >
<APPLET code=StockApplet.classname=StockApplet HEIGHT=500WIDTH=400>
</APPLET >
</body >
</HTML >
在< APPLET >< /APPLET >标签对内,是对Java Applet⼩程序的调⽤代码。其中的StockApplet.class是经编译后⽣成的class⽂
件,codeBase指向的是class⽂件所存放的路径。如果class⽂件与HTML⽂档存放在同⼀⽬录下,则可以省略这⼀项。
⾄此,编制Java Applet⼩程序的⼯作便全部完成。
调试通过后,便可上传⾄服务器投⼊运⾏了。