在前面,我用多线程写了一个绘制了股票K线图的程序.这里我再通过绘制一个成交量的统计图说明对鼠票事件的应用.这里我们要传入几个参数:
<applet code="sellhis.class" Archive="sellhis.jar" width="640" height="400">
<Param name="itemmonth" value="200201">
<Param name="itemcode" value="00002,00014,00019,00023,00041,00102,00113,00114,
00129,00132,00142,00146,00179,00203,00213,00223,00341">
<Param name="itemval" value="272950,193950,1015600,142700,1618500,671650,
2453300,630150,28375,1827660,7700,75700,27375,3375600,47500,17500,17500">
<Param name="itempce" value="219,156,817,114,2302,540,1974,507,22,
1471,6,60,22,4717,38,114,14">
</applet>
查看演示
sellhis.java源程序如下:
import java.awt.*;
import java.applet.*;
import java.awt.font.*;
import java.awt.event.*;
import java.io.*;
import java.lang.*;
import java.util.*;
public class sellhis extends Applet{
static int Len;
int leftMargine=50;
int rightMargine=20;
int topMargine=80;
int buttomMargine=20;
int width,height,w,h;
int minStickLength=3; //坐标的短刻度
int majStickLength=8; //坐标的长刻度
int minStick=10;
int majStick;
String title;
String xTitle="股票代碼";
String xCode[];
float yData[],xPce[];
String MaxPce;
boolean Mouse_Move;
int x0,y0,X,Y,hx,hy;
Label label[]=new Label[3];
boolean mouse_move=false;
public void init() {
width=this.getBounds().width;
height=this.getBounds().height;
w=width-leftMargine-rightMargine;
h=height-topMargine-buttomMargine;
setSize(width,height);
Color bc=new Color(229,229,229);
setBackground(bc);
setLayout(null);
for(int I=0;I<3;I++){
label[I]=new Label();
label[I].setForeground(Color.blue);
this.add(label[I]);
if(I==0)
label[I].reshape(75,topMargine-25,60,15);
if(I==1)
label[I].reshape(230,topMargine-25,80,15);
if(I==2)
label[I].reshape(505,topMargine-25,60,15);
}
try{
title=getTitle(getParameter("itemmonth"));
}
catch(Exception e){
System.out.println("Param itemmonth error!");
System.out.println(e);
}
try{
xCode=Subicode(getParameter("itemcode"));
Len=xCode.length;
hx=w/Len;
}
catch(Exception e){
System.out.println("Param itemcode error!");
System.out.println(e);
}
try{
yData=Substr(getParameter("itemval"));
}
catch(Exception e){
System.out.println("Param itemval error!");
System.out.println(e);
}
try{
xPce=Substr(getParameter("itempce"));
MaxPce=getMaxVal(xPce);
majStick=Integer.parseInt(MaxPce.substring(0,1))+2; //取最大pce的最大整数
}
catch(Exception e){
System.out.println("Param itempce error!");
System.out.println(e);
}
try{
addMouseListener(new MouseAdapter(){
public void mouseReleased(MouseEvent evt){//检测释放鼠标按键事件
setCursor(Cursor.getDefaultCursor());
Point ioc=evt.getPoint();
X=ioc.x; //把当前座标传递给另一线程
Y=ioc.y;
//repaint();
}
});
addMouseMotionListener(new MouseMotionAdapter(){
public void mouseDragged(MouseEvent evt){
Point ioc=evt.getPoint();
if((ioc.x>leftMargine & ioc.x< w+leftMargine) & (ioc.y >topMargine & ioc.y< h+topMargine))
setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
else
setCursor(Cursor.getDefaultCursor());
}
public void mouseMoved(MouseEvent evt){ //检测鼠标移动事件
Point ioc=evt.getPoint();
X=ioc.x;
Y=ioc.y;
Graphics gten;
gten=getGraphics();
gten.setXORMode(Color.white);
gten.setColor(Color.blue);
int Axsis;
if(ioc.x >leftMargine & ioc.x< w+leftMargine & ioc.y>topMargine & ioc.y<h+topMargine){
try{
Axsis=(X-leftMargine)/hx; //设定横座标范围
//在以下区域内,把鼠标当前横座标处的各种股票参数显示在相应的标签上
label[0].setText(xCode[Axsis]);
label[1].setText(Float.toString(yData[Axsis]));
float pcent=(xPce[Axsis]/100);
label[2].setText(Float.toString(pcent));
}
catch(Exception err){
}
try{
if(y0 >topMargine & y0< h+topMargine)
gten.drawLine(leftMargine,y0,w+leftMargine,y0);
if(Y >topMargine & Y< h+topMargine)
gten.drawLine(leftMargine,Y,w+leftMargine,Y);
if(x0 >leftMargine & x0< w+leftMargine)
gten.drawLine(x0,topMargine,x0,h+topMargine);
if(X >leftMargine & X< w+leftMargine)
gten.drawLine(X,topMargine,X,h+topMargine);
x0=X;
y0=Y;
}
finally{
gten.dispose();
}
}
}
});
}
catch(Exception e)
{
System.out.println("sellhis construct add mouse listener error!");
System.out.println(e);
}
}
public void paint(Graphics g){
try{
g.drawString("股票代碼:",20,topMargine-15);
g.drawString("賣空成交金額:",150,topMargine-15);
g.drawString("賣空成交金額占總賣空成交金額%:",320,topMargine-15);
g.drawRect(leftMargine,topMargine,w,h); //矩形方框
int x0,y0,x1,y1,dy;
int totalStick=(majStick-1)*minStick;
x0=leftMargine;
dy=h/((majStick-1)*minStick);
for(int I=1;I<=totalStick;I++){
y0=height-buttomMargine-I*dy;
y1=y0;
x1=x0-minStickLength;
if(I%minStick==0){
x1=x0-majStickLength;
g.drawString(""+((I)/minStick)+"0%",x1-25,y0+5); //y轴刻度数字
}
g.drawLine(x0,y0,x1,y1); //y轴刻度标
}
for(int I=0;I<Len;I++){
x0=leftMargine+I*hx;
hy=(int)((xPce[I]/100)*(h/((majStick-1)*10)));
y0=height-buttomMargine-hy;
float pcent=(xPce[I]/100);
Color pceCololr=new Color(153,0,153);
g.setColor(pceCololr);
g.setFont(new Font("Times New Roman",Font.PLAIN,11));
g.drawString(Float.toString(pcent),x0,y0-5);//在柱状图上绘制%
if(I%2==0)
g.setColor(Color.orange);
else
g.setColor(Color.red);
g.fillRect(x0,y0,hx,hy); //绘制柱状图
//g.setColor(Color.red); //绘制股票代码
//g.setFont(new Font("Times New Roman",Font.PLAIN,10));
//g.drawString(""+xCode[I],x0,height-topMargine+40);
}
Color titleColor=new Color(0,64,128);
g.setColor(titleColor);
g.setFont(new Font("monospaced",Font.BOLD,20));
g.drawString(title,190,40);
}
catch(Exception e){
System.out.println("sellhis paint error.");
System.out.println(e);
}
}
public static float[] Substr(String str){
int I=0;
StringTokenizer st = new StringTokenizer(str,",");
int len=st.countTokens();
float[] val=new float[len];
while(st.hasMoreTokens()) {
val[I]=Integer.parseInt(st.nextToken());
I++;
}
return val;
}
public static String[] Subicode(String str){
int I=0;
StringTokenizer st = new StringTokenizer(str,",");
int len=st.countTokens();
String[] val=new String[len];
while(st.hasMoreTokens()) {
val[I]=st.nextToken();
I++;
}
return val;
}
public static String getMaxVal(float[] Maxval){
int I;
float result;
result=Maxval[0];
for(I=0;I<Maxval.length;I++){
if(result<Maxval[I])
result=Maxval[I];
}
return Float.toString(result);
}
public String getTitle(String str){
String title;
title=str.substring(0,4)+"年"+str.substring(4,6)+"月賣空股票統計";
return title;
}
public int getLeftMargine(){
return leftMargine;
}
public int getButtomMargine(){
return buttomMargine;
}
public void setLeftMargine(int leftMargine){
this.leftMargine=leftMargine;
}
public void setButtomMargine(int buttomMargine){
this.buttomMargine=buttomMargine;
}
}
……