java绘制一个成交量的统计图

  在前面,我用多线程写了一个绘制了股票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&gt;leftMargine&ioc.x&lt;w+leftMargine)&(ioc.y&gt;topMargine&ioc.y&lt;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&gt;leftMargine&ioc.x&lt;w+leftMargine&ioc.y&gt;topMargine&ioc.y&lt;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&gt;topMargine&y0&lt;h+topMargine)
  gten.drawLine(leftMargine,y0,w+leftMargine,y0);
  if(Y&gt;topMargine&Y&lt;h+topMargine)
  gten.drawLine(leftMargine,Y,w+leftMargine,Y);
  if(x0&gt;leftMargine&x0&lt;w+leftMargine)
  gten.drawLine(x0,topMargine,x0,h+topMargine);
  if(X&gt;leftMargine&X&lt;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&lt;=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&lt;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&lt;Maxval.length;I++){
  if(result&lt;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;
  }
  }