在前面,我用多线程写了一个绘制了股票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; } } |