java k线绘制,用Java绘制K线 (转2)-JSP教程,Application/Applet

本文介绍了一个使用Java Applet实现的股票K线图绘制程序。该程序能够通过网络获取股票数据,并在界面上动态展示股票的开盘价、收盘价等信息。用户可以通过鼠标操作查看详细的历史数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

—- 附:stockapplet.java

import java.applet.*;

import java.awt.*;

import java.io.*;

import java.net.*;

public class stockapplet extends java.applet.applet implements runnable

{ //以下是公用变量的声明部分

int move_length=0,move_sum=0;

string filename,name_str,content_date;

int sp[]=new int[2000];

int kp[]=new int[2000];

int jd[]=new int[2000];

int jg[]=new int[2000];

int mid_worth[]=new int[2000];

string mydate[]=new string[2000];

double cjl[]=new double[2000];

double maxcjl,midcjl;

label label[]=new label[10];

int maxworth,minworth;

int x_move0,x_move1,maxlength=0;

int x0,y0,x,y,record_num;

boolean mouse_move,name_change=true;

int jx_five1,jx_five2,jx_ten1,jx_ten2;

public void init()

{

textfield text1=new textfield();

thread m_pointthread=null;

setlayout(null);                  //声明布局管理器

this.setbackground(color.white);    //设置背景色

this.setforeground(color.black);     //设定文字颜色

for(int i=1;i< 10;i++)      //以下循环用于向布局中添加标签

{

label[i]=new label();

this.add(label[i]);

label[i].reshape(i*80-65,10,50,15);

if(i==2){label[i].reshape(80,10,70,15);}

if(i==7){label[i].reshape(510,10,80,15);}

if(i >7){label[i].reshape((i-8)*490+45,380,70,15);}

}

filename="000001";        //程序启动时的默认股票代码

name_str="上证指数";

this.add(text1);             //向布局中添加文本框

text1.reshape(150,385,70,20);

text1.gettext();             //取得文本框中输入的内容

}

public void start()

{    //创建并启动多线程

if (m_pointthread==null)

{

m_pointthread=new thread(this);

m_pointthread.start();

}

}

public void run()

{    //运行多线程

graphics m_graphics;

m_graphics=getgraphics();

m_graphics.setxormode(color.white);

while(true)  //绘制“十字”游标

{

try

{

if(mouse_move==true)

{

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);}

mouse_move=false;

x0=x;

y0=y;

}

}catch(nullpointerexception npe){}

}

}

public boolean action(event evt,object arg)   //监测事件

{

filename=text1.gettext();    //取得新文件名

repaint();

//将各变量恢复初始状态

name_change=true;

move_length=0;

move_sum=0;

maxlength=0;

maxcjl=0;

return true;

}

public boolean keydown(event evt,int key)  //检测键盘事件

{

if(key==10)    //检测是否是回车键

{

event event=new event(text1,event.action_event,"text1");

deliverevent(event);

return true;

}

return false;

}

public boolean mousedown(event evt,int x_d,int y_d)   //检测按下鼠标按键事件

{

x_move0=x_d;     //记录鼠标当前的横座标

x0=x_d;          //把当前座标传递给另一线程

y0=y_d;

return true;

}

public boolean mouseup(event evt,int x_up,int y_up)  //检测释放鼠标按键事件

{

int screen=520;      //定义在页面上的显示区域

x_move1=x_up;      //记录鼠标当前的横座标

move_length=((int)(x_move1-x_move0)/10)*10;    //计算鼠标移动距离

move_sum=move_sum+move_length;

if(move_sum< 0){move_sum=0;}    //控制k线的拖动范围

if(move_sum >maxlength-screen){move_sum=maxlength-screen-10;}

x0=x_up;         //把当前座标传递给另一线程

y0=y_up;

maxworth=jg[move_sum];

minworth=jd[move_sum];

maxcjl=cjl[move_sum];

//以下循环用于查找页面显示区域内的最高、最低值及成交量

for(int i=screen+move_sum;i >move_sum;i-=10)

{

if(maxworth< jg[i]){maxworth=jg[i];}

if(minworth >jd[i]){minworth=jd[i];}

if(maxcjl< cjl[i]){maxcjl=cjl[i];}

}

midcjl=maxcjl/2;

for(int i=1;i< 7;i++)            //计算出在纵座标上显示的中间值

{

mid_worth[i]=minworth+(maxworth-minworth)/7*(7-i);

}

repaint();

return true;

}

public boolean mousemove(event evt,int x_m,int y_m)   //检测鼠标移动事件

{

int axsis,mnumberr;

mouse_move=true;

axsis=560+move_sum-((int)(x_m/10))*10;        //设定横座标范围

if(axsis >maxlength){axsis=maxlength;}

//在以下区域内,把鼠标当前横座标处的各种股票参数显示在相应的标签上

if(x_m >50&x_m< 600)

{

label[2].settext(mydate[axsis]);

label[3].settext(string.valueof((float)kp[axsis]/100));

label[4].settext(string.valueof((float)jg[axsis]/100));

label[5].settext(string.valueof((float)jd[axsis]/100));

label[6].settext(string.valueof((float)sp[axsis]/100));

label[7].settext(string.valueof((int)cjl[axsis]));

label[8].settext(mydate[510+move_sum]);

mnumberr=move_sum;

if(move_sum >30){mnumberr=move_sum-30;}

label[9].settext(mydate[mnumberr]);

x=x_m;        //把当前座标传递给另一线程

y=y_m;

}

return true;

}

public void stop()        //当页面关闭或转向其他页面时,释放系统资源

{

if (m_pointthread!=null)

{

m_pointthread.stop();

m_pointthread=null;

}

}

public void paint(graphics g)  //绘图方法

{

if(name_change==true)  //若改变了查询股票的代码

{

readdata();        //则重新读取数据

name_change=false;

}

paintframe(g);          //调用绘制页面区域方法

paintdata(g);           //调用绘制k线数据方法

x0=-1;

y0=-1;

}

private void paintframe(graphics g)  //绘制页面区域方法

{

int nwidth =600;

int nheight=260;

g.setcolor(color.white);

g.fillrect(0,0,600,420);

g.setcolor(color.black);

g.fillrect(50,30,550,350);

g.setcolor(color.white);

g.drawline(50,nheight,nwidth,nheight);    //画出上下两区域间的分隔线

g.setcolor(color.black);      //设置字体颜色

for(int i=1;i< 7;i++)      //绘出纵座标中间数值

{

g.drawstring(string.valueof((float)mid_worth[i]/100),10,55+i*30);

}

g.drawstring(string.valueof((int)maxcjl),2,270);

g.drawstring(string.valueof((int)midcjl),8,325);

g.drawstring("0",40,380);

}

public void paintdata(graphics g)      //绘制k线数据方法

{

int sppoint[]=new int[2000];

int kppoint[]=new int[2000];

int jgpoint[]=new int[2000];

int jdpoint[]=new int[2000];

double cjlpoint[]=new double[2000];

int left_start=40,redraw=250;        //设置绘图左边界及参数

int i=0;

int jxtemp1=0,jxtemp2=0;

//以下语句在布局区域内绘出固定信息

g.setcolor(color.red);

g.drawstring("牡丹江",5,45);

g.drawstring("信息港",5,60);

g.setcolor(color.black);

g.drawstring("开盘",150,20);

g.drawstring("最高",230,20);

g.drawstring("最低",310,20);

g.drawstring("收盘",390,20);

g.drawstring("成交量",470,20);

g.drawstring("要查询其他股票,请输入股票代码,然后回车。",230,400);

for(int n=maxlength;n >=0;n-=10)        //该循环用于在绘图区域内作图

{            //计算股票各参数在绘图区域内要显示的相对值

kppoint[n]=((kp[n]-minworth)*200/(maxworth-minworth));

sppoint[n]=((sp[n]-minworth)*200/(maxworth-minworth));

jgpoint[n]=((jg[n]-minworth)*200/(maxworth-minworth));

jdpoint[n]=((jd[n]-minworth)*200/(maxworth-minworth));

cjlpoint[n]=(cjl[n]*120/maxcjl);

for(int num=0;num< 5;num++)        //计算五日均线

{

jxtemp1=jxtemp1+(sppoint[n+(num+1)*10]);

jxtemp2=jxtemp2+(sppoint[n+num*10]);

}

jx_five1=jxtemp1/5;

jx_five2=jxtemp2/5;

jxtemp1=0;

jxtemp2=0;

for(int num=0;num< 10;num++)        //计算十日均线

{

jxtemp1=jxtemp1+(sppoint[n+(num+1)*10]);

jxtemp2=jxtemp2+(sppoint[n+num*10]);

}

jx_ten1=jxtemp1/10;

jx_ten2=jxtemp2/10;

jxtemp1=0;

jxtemp2=0;

if(n< 520+move_sum)        //若位于显示区域内,则绘制k线

{

i=i+10;                  //横座标按10象素递增

g.setcolor(color.white);

g.drawline(i+left_start,220-jx_five1,i+left_start+10,220-jx_five2);

g.setcolor(color.yellow);

g.drawline(i+left_start,220-jx_ten1,i+left_start+10,220-jx_ten2);

if(kp[n]< =sp[n])          //如果开盘价小于收盘价,则绘制阳线

{       //绘制空心矩形

g.setcolor(color.red);

g.drawrect(i+left_start,redraw-sppoint[n],8,(sppoint[n]-kppoint[n]));

//绘制最高、最低价

if(sppoint[n]==kppoint[n]){g.drawrect(i+left_start,redraw-sppoint[n],8,1);}

if(jgpoint[n] >sppoint[n]){g.drawline(i+left_start+4,redraw-sppoint[n],  i+left_start+4,redraw-jgpoint[n]);}

if(jdpoint[n]< kppoint[n]){g.drawline(i+left_start+4,redraw-jdpoint[n],  i+left_start+4,redraw-kppoint[n]);}

//在下方对应位置绘制成交量实心矩形

g.fillrect(i+left_start,380-(int)cjlpoint[n],8,(int)cjlpoint[n]);

}

else       //如果开盘价大于收盘价,则绘制阴线

{         //绘制实心矩形

g.setcolor(color.green);

g.fillrect(i+left_start,redraw-kppoint[n],8,(kppoint[n])-sppoint[n]);

//绘制最高、最低价

g.drawline(i+left_start+4,redraw-kppoint[n],i+left_start+4,redraw-jgpoint[n]);

g.drawline(i+left_start+4,redraw-sppoint[n],i+left_start+4,redraw-jdpoint[n]);

//在下方对应位置绘制成交量实心矩形

g.fillrect(i+left_start,380-(int)cjlpoint[n],8,(int)cjlpoint[n]);

}

if(i >540){n=0;}  //如果显示区域已全部绘制完毕,则退出循环

}

}

}

public void readdata()              //读取股票数据的方法

{

int piont=1,piont_num;

integer tempinteger;

float tempfloat , content_cjl;

float content_num[]=new float[5];

int count_number[]=new int[10];

string content;

try

{    //定位文件的url地址

url urlc=new url("http://127.0.0.1/temp/"+filename+".txt");

//打开数据流

bufferedreader bis=new bufferedreader(new inputstreamreader(urlc.openstream()));

name_str=bis.readline();            //读取股票的汉字名称

label[1].settext(name_str);          //在相应标签内显示

while((content=bis.readline())!=null)   //按行读取整个文本文件内容

{

piont_num=content.indexof( ,piont);        //查找空格位置

content_date=content.substring(1,piont_num);    //取出日期字符串

mydate[maxlength]=content_date;

piont=piont_num+1;

for(int i=1;i< 5;i++)      //从读入的一行中分离出对应数值

{

piont_num=content.indexof( ,piont);

content_num[i]=new float(content.substring(piont,piont_num));

piont=piont_num+1;

}

kp[maxlength]=(int)(content_num[1].floatvalue()*100);

jg[maxlength]=(int)(content_num[2].floatvalue()*100);

jd[maxlength]=(int)(content_num[3].floatvalue()*100);

sp[maxlength]=(int)(content_num[4].floatvalue()*100);

//最后取出成交量的数值

content_cjl=new float(content.substring(piont,content.length()-1));

cjl[maxlength]=(int)content_cjl.floatvalue();

piont=1;

piont_num=0;

maxlength=maxlength+10;    //读取下一行(记录数以10为单位递增)

}

maxworth=jg[move_sum];

minworth=jd[move_sum];

maxcjl=cjl[move_sum];

//找出在页面布局内的最高、最低值及最大成交量

for(record_num=540+move_sum;record_num >move_sum;record_num-=10)

{

if(maxworth< jg[record_num]){maxworth=jg[record_num];}

if(minworth >jd[record_num]){minworth=jd[record_num];}

if(maxcjl< cjl[record_num]){maxcjl=cjl[record_num];}

}

midcjl=maxcjl/2;

for(int i=1;i< 7;i++)      //计算中间值

{

mid_worth[i]=minworth+(maxworth-minworth)/7*(7-i);

}

bis.close();              //关闭数据流

repaint();

}catch(nullpointerexception npe){  //捕捉可能出现的异常

}catch(ioexception e){}

}

}

__________________________

我用javac stockapplet.java编译出来8个错误,想想也是,没人把完全正确的程序帖出来的,靠这个吃饭的,总要保留一点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值