当前位置导航:炫浪网>>网络学院>>编程开发>>JAVA教程>>Java进阶

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


  在前面,我用多线程写了一个绘制了股票K线图的程序.这里我再通过绘制一个成交量的统计图说明对鼠票事件的应用.这里我们要传入几个参数:
  
  
  
  
  
  
  
  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  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  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  if(result  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;
  }
相关内容
赞助商链接