我的性能图怎么会出这种问题呢!!!!!到底怎么回事啊??我好伤心的,GG救救我拉!那个JScrollPane到底有什么玄机啊~~~~~~~~~~~~~~~~~~~~
各位GG,我的代码如下,一共是2个类,要在一起编译了用。碰到的问题是,当你不停的移动JScrollPane的滚动条时,或者有什么窗口在图上移动时,就会报ArrayIndexOutOfException的错误,可是我就是查不出来!!!受不了了,都有一天了!!!!
第一个》》
/*
*
*Copyright (c) 2001- Arko Information Technology Co.Ltd All Rights Reserved.
*
*
*@(#)PerformancePaint.java Version:3.1
*
*
*Programmer: Yingyi Xie
*Date: 2001/07/19
*
*
*/
import java.util.*;
import java.net.*;
import java.applet.*;
import java.awt.Graphics;
import java.awt.image.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.geom.*;
/*
*
*显示Y坐标值面板类
*
*实现Y坐标动态变化显示
*
*
*/
public class PerformancePaint extends JApplet{
//模拟数据
String yValue=new String("1.11732234&3.7&6.3&8.9&56.7");//y坐标的坐标值
Font font;
Color color;
JPerformYPanel Jperformypanel;
public void init(){
Container contentPane=this.getContentPane();
contentPane.setLayout(null);
font=new Font("宋体", Font.PLAIN,12);
color=new Color(0,0,0);
Jperformypanel=new JPerformYPanel(yValue);
Jperformypanel.setBounds(30,155,720,391);
contentPane.add(Jperformypanel);
}//end init()
}//end class PerformancePaint
class JPerformYPanel extends JPanel{
int i;//循环变量
String yValue=new String("");
int dataCutmark=0;//进入dataCut次数为2时标记
Float String_float_yValue;
float yValue_array[];//比较各个Y坐标值的大小的数组
double value1=0;//用于求得字符串中的最大值变量
double value2=0;//用于求得字符串中的最大值变量
double yMax;//y坐标的最大值
int yValue_num;//字符串长度
double yrate;//y坐标上的倍率
JPerformYPanel(String yValue){
this.yValue=yValue;
init();
}
public void init(){
dataCut(yValue);
}//end init()
public void dataCut(String yValue){
StringTokenizer str_yValue=new StringTokenizer(yValue,"&");
yValue_num=str_yValue.countTokens();
yValue_array=new float[yValue_num];
if(yValue_num==1)
{
if(dataCutmark==0)
{
for(i=0;i<yValue_num;i++)
{
String_float_yValue=new Float(str_yValue.nextToken());
yValue_array[i]=String_float_yValue.floatValue();
if(yValue_array[i]==0)
value1=0.84;
else
value1=yValue_array[i];
}//end for i
if(value1<0.85)
yMax=Math.ceil(value1/0.85);
else
yMax=Math.floor(value1/0.85+0.99);
//求出y坐标点的倍率
yrate=(double)(yMax/250);
dataCutmark=1;
value2=value1;
}else{
for(i=0;i<yValue_num;i++)
{
String_float_yValue=new Float(str_yValue.nextToken());
yValue_array[i]=String_float_yValue.floatValue();
if(yValue_array[i]==0)
value1=0.84;
else
value1=yValue_array[i];
}//end for i
if(value1>value2&&value1<0.85)
yMax=Math.ceil(value1/0.85);
else
yMax=Math.floor(value1/0.85+0.99);
yrate=(double)(yMax/250);
}//end else
}else{
if(dataCutmark==0)
{
for(i=0;i<yValue_num;i++)
{
String_float_yValue=new Float(str_yValue.nextToken());
yValue_array[i]=String_float_yValue.floatValue();
if(i==0)
value1=yValue_array[0];
else
if(yValue_array[i]>=value1&&value1!=0)
value1=yValue_array[i];
else
value1=0.84;
}//end for i
if(value1<0.85)
yMax=Math.ceil(value1/0.85);
else
yMax=Math.floor(value1/0.85+0.99);
//求出y坐标点的倍率
yrate=(double)(yMax/250);
dataCutmark=1;
value2=value1;
}else{
for(i=0;i<yValue_num;i++)
{
String_float_yValue=new Float(str_yValue.nextToken());
yValue_array[i]=String_float_yValue.floatValue();
if(i==0)
value1=yValue_array[0];
else
if(yValue_array[i]>=value1&&value1!=0)
value1=yValue_array[i];
else
value1=0.84;
}//end for i
if(value1>value2&&value1<0.85)
yMax=Math.ceil(value1/0.85);
else
yMax=Math.floor(value1/0.85+0.99);
yrate=(double)(yMax/250);
}//end else
}//end else
}//end dataCut();
public void paint(Graphics g){
Graphics2D g2=(Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
int yWidth=25;
int ynum=9;
int xstart=125;
int ystart=250;
int place;
g2.setFont(new Font(Float.toString((float)(i*yWidth*yrate)),Font.BOLD,12));
//下面的语句用于定好Y坐标显示的正确的位置//
if ((float)(ynum*yWidth*yrate)>=1.0000000E7)
{
place=(Float.toString((float)(ynum*yWidth*yrate)).indexOf("."));
for (i=0;i<=ynum;i++){
switch(place+7){
case 8:
g2.drawString(""+(float)(i*yWidth*yrate),30,ystart-yWidth*i);
break;
}//end switch()
}//end for i
}else{
place=(Float.toString((float)(ynum*yWidth*yrate)).indexOf("."));
for (i=0;i<=ynum;i++){
switch(place){
case 1:
g2.drawString(""+(float)(i*yWidth*yrate),60,ystart-yWidth*i);
break;
case 2:
g2.drawString(""+(float)(i*yWidth*yrate),50,ystart-yWidth*i);
break;
case 3:
g2.drawString(""+(float)(i*yWidth*yrate),40,ystart-yWidth*i);
break;
case 4:
g2.drawString(""+(float)(i*yWidth*yrate),30,ystart-yWidth*i);
break;
case 5:
g2.drawString(""+(float)(i*yWidth*yrate),20,ystart-yWidth*i);
break;
case 6:
g2.drawString(""+(float)(i*yWidth*yrate),10,ystart-yWidth*i);
break;
case 7:
g2.drawString(""+(float)(i*yWidth*yrate),0,ystart-yWidth*i);
break;
}//end switch()
}//end for i
}//end else;
g2.dispose();
}//end paint();
public double getYMax(){
return yMax;
}//end getYmax()
}//end class JPerformYPanel
第二个》》
/*
*
*Copyright (c) 2001- Arko Information Technology Co.Ltd All Rights Reserved.
*
*
*@(#)PerformanceDraw.java Version:3.1
*
*
*Programmer: Yingyi Xie
*Date: 2001/07/19
*
*
*/
import java.util.*;
import java.net.*;
import java.applet.*;
import java.awt.Graphics;
import java.awt.image.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.geom.*;
import java.lang.Thread;
/*
*
*显示性能图面板类
*
*实现实时浏览性能图
*
*
*/
public class PerformanceDraw extends JApplet implements Runnable{
//模拟数据
String yValue=new String("1.11732234&3.7&6.3&8.9&56.7");//y坐标的坐标值
String interfacename=new String("com1&com2&com3&com4&com5");//接口名
int pollingtime=1;//轮循时间
Font font;
Thread thisthread;
JPerformYPanel Jperformypanel;
JPerfromDrawing Pdraw;
JScrollPane drawScroll;
int xnum;//x坐标轴的间隔数
double yMax;//y坐标最大值
public void init(){
Container contentPane=this.getContentPane();
contentPane.setLayout(null);
font=new Font("宋体", Font.PLAIN,12);
Jperformypanel=new JPerformYPanel(yValue);
yMax=Jperformypanel.getYMax();
Pdraw=new JPerfromDrawing(yValue,interfacename,pollingtime,yMax);
Pdraw.setPreferredSize(new Dimension(10,250));
drawScroll=new JScrollPane(Pdraw);
drawScroll.setBounds(10,10,620,300);
contentPane.add(drawScroll);
thisthread=new Thread(this);
}//end init()
public void start(){
thisthread.start();
}
public void run(){
String newData=new String("1.11732234&3.7&46.53&25.7&15.6");
JScrollBar Bar=drawScroll.createHorizontalScrollBar();
while(true){
try{
Pdraw.getNewData(newData);
xnum=Pdraw.getXnum();
Pdraw.setPreferredSize(new Dimension(xnum*100,250));
System.out.println("width="+xnum*100);
if(xnum*100>620)
{
drawScroll.setHorizontalScrollBar(Bar);
drawScroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
drawScroll.setViewportView(Pdraw);
drawScroll.validate();
drawScroll.repaint();
}
}catch(ArrayIndexOutOfBoundsException e){}
try{
thisthread.sleep(1000);
}catch(InterruptedException e){}
}//end while
}//end run()
public void stop(){
thisthread.stop();
}
}//end class JPerformanceDraw
class JPerfromDrawing extends JPanel{
Color color1,color2,color3;
int i,j;//循环变量
String yValue=new String("");//Y坐标点字符串
String interfacename=new String("");//接口名
int pollingtime=0;//轮循时间
double yMax;//Y坐标最大值
Vector performVector;//存放所有未经过处理的Y坐标点数组
int str_interfacename_num;
float yValue_array[];//所有经过单精度处理的Y坐标点数组
int xPoints[][],yPoints[][];//作性能图的X、Y坐标点数组;
int xLength=100;//x坐标轴间隔距离
int ynum=10;//y坐标上的间隔数
int yLength=25;//y坐标上的间隔距离
int mark=0,mark_time=0;
JPerfromDrawing(String yValue,String interfacename,int pollingtime,double yMax){
this.yValue=yValue;
this.interfacename=interfacename;
this.pollingtime=pollingtime;
this.yMax=yMax;
init();
}
public void getNewData(String newData){
//newData
StringTokenizer str_newData=new StringTokenizer(newData,"&");
int str_newData_num=str_newData.countTokens();
if(performVector.size()>50*str_newData_num)
{//防止内存泄露
System.out.println("performVector>51*5");
for(int i=0;i<str_newData_num;i++)
{ performVector.removeElementAt(0);
performVector.addElement(str_newData.nextToken().trim());
}
}else{
System.out.println("performVector<=51*5");
for(int i=0;i<str_newData_num;i++)
performVector.addElement(str_newData.nextToken().trim());
}
dataConvert(performVector);
//初始化性能图X坐标点
xPoints=new int[str_interfacename_num][performVector.size()/str_interfacename_num];
for(int j=0;j<str_interfacename_num;j++)
{
for(i=performVector.size()/str_interfacename_num-1;i>=0;i--)
xPoints[j][i]=xLength*i;
}//end for j
//初始化性能图Y坐标点
yPoints=new int[str_interfacename_num][performVector.size()/str_interfacename_num];
for(j=0;j<str_interfacename_num;j++)
{
for(i=0;i<performVector.size()/str_interfacename_num;i++)
yPoints[j][performVector.size()/str_interfacename_num-i-1]=(int)(250-(int)(yValue_array[i*str_interfacename_num+j]*250/yMax));
}//end for j
mark =mark+1;
if(mark>51)
mark_time=mark_time+1;
repaint();
getXnum();
}//end getNewData()
public void init(){
setBackground(Color.white);
color1=new Color(150,150,150);//X坐标轴颜色
color2=new Color(0,0,0);//醒目小方块颜色
color3=new Color(185,187,208);//平行X轴装饰线颜色
//interfacename
StringTokenizer str_interfacename=new StringTokenizer(interfacename,"&");
str_interfacename_num=str_interfacename.countTokens();
//yValue
StringTokenizer str_yValue=new StringTokenizer(yValue,"&");
int str_yValue_num=str_yValue.countTokens();
performVector=new Vector();
for(int i=0;i<str_yValue_num;i++)
{
performVector. addElement(str_yValue.nextToken().trim());
}//end for i
dataConvert(performVector);
//初始化性能图X坐标点
xPoints=new int[str_interfacename_num][performVector.size()/str_interfacename_num];
for(int j=0;j<str_interfacename_num;j++)
{
for(i=performVector.size()/str_interfacename_num-1;i>=0;i--)
xPoints[j][i]=xLength*i;
}//end for j
//初始化性能图Y坐标点
yPoints=new int[str_interfacename_num][performVector.size()/str_interfacename_num];
for(j=0;j<str_interfacename_num;j++)
{
for(i=0;i<performVector.size()/str_interfacename_num;i++)
yPoints[j][performVector.size()/str_interfacename_num-i-1]=(int)(250-(int)(yValue_array[i*str_interfacename_num+j]*250/yMax));
}//end for j
}//end init()
public void dataConvert(Vector performVector){
Float String_float_yValue;
String strDealWith=new String("");
for(i=0;i<performVector.size();i++)
strDealWith=new String(strDealWith+performVector.elementAt(i)+"&");
StringTokenizer strDealWith_Token=new StringTokenizer(strDealWith,"&");
int strDealWith_Token_num=strDealWith_Token.countTokens();
yValue_array=new float[strDealWith_Token_num];
for(i=0;i<strDealWith_Token_num;i++)
{
String_float_yValue=new Float(strDealWith_Token.nextToken());
yValue_array[i]=String_float_yValue.floatValue();
}//end for i
}//end dataConvert()
public void paint(Graphics g){
super.paint(g);
Graphics2D g2=(Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
for (i=0;i<performVector.size()/str_interfacename_num;i++)
{
g2.setColor(color1);
g2.drawLine(xLength*i,245,xLength*i,250);//画x坐标间隔线
g2.drawLine(xLength*i-1,245,xLength*i-1,250);//画x坐标间隔线
g2.drawLine(xLength*i-1,0,xLength*i-1,250);
}// end for i
if(mark<=51)
{
System.out.println("mark<=51"+" "+"mark="+mark);
System.out.println("mark_time="+mark_time);
for (i=0;i<performVector.size()/str_interfacename_num;i++)
g.drawString(""+pollingtime*(performVector.size()/str_interfacename_num-1-i)+"s",xLength*i,265);//画x坐标点的坐标
}else{
System.out.println("mark<=51"+" "+"mark="+mark);
System.out.println("mark_time="+mark_time);
for (i=0;i<performVector.size()/str_interfacename_num;i++)
g.drawString(""+(pollingtime*(performVector.size()/str_interfacename_num-1-i)+pollingtime*mark_time)+"s",xLength*i,265);//画x坐标点的坐标
}//end else
g2.setColor(color1);
g2.drawLine(0,250,xLength*(performVector.size()/str_interfacename_num-1),250);//画x坐标轴
g2.drawLine(0,251,xLength*(performVector.size()/str_interfacename_num-1),251);//画装饰x坐标轴
//画坐标值醒目小方快//
for (j=str_interfacename_num-1;j>=0;j--)
{
for (i=performVector.size()/str_interfacename_num-1;i>=0;i--)
{
g2.setColor(color2);
g2.fillRect(xPoints[j][i]-2,yPoints[j][i]-2,5,5);
}//end for i
}//end for j
//画平行X轴装饰线
for (i=0;i<=ynum;i++)
{
if(yLength*i<276)
{
g2.setColor(color3);
g2.drawLine(0,275-yLength*(i+1),xLength*(50-10-1)-2,275-yLength*(i+1));//画装饰线;
g2.drawLine(xLength*(50-10-1)-2,275-yLength*(i+1),xLength*(51-1)-2,275-yLength*(i+1));//画装饰线;
}// end if;
}// end for i
//画性能图线
for (j=str_interfacename_num-1;j>=0;j--){
for (i=(performVector.size()/str_interfacename_num-1);i>0;i--)
{
g2.setColor(color2);
g2.drawLine(xPoints[j][i],yPoints[j][i],xPoints[j][i-1],yPoints[j][i-1]);
}//end for i
}//end for j
g2.dispose();
}//end paint()
public int getXnum(){
return (xPoints[0].length-1) ;
}
}//end class PerformDrawing