我的性能图怎么会出这种问题呢!!!!!到底怎么回事啊??我好伤心的,GG救救我拉!那个JScrollPane到底有什么玄机啊~~~~~~~~~~~~~~~~~~~~

pearl_091278 2001-07-21 12:54:41
各位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
...全文
92 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
pearl_091278 2001-07-21
  • 打赏
  • 举报
回复
怎么到晚上还是没有GG帮我看看呢~~~我今天又改过程序了,发现了一些错误,等明天在贴出来看看~~~~~~~~希望GG们不要嫌小M烦,大家都是程序员,混口饭饭吃呀!
Altair 2001-07-21
  • 打赏
  • 举报
回复
数组越界了,多半在drawLine()那一句了,好好检查一下哪个元素为空或者下标超出范围了,太长了,实在不想看
gxj0637 2001-07-21
  • 打赏
  • 举报
回复
数组越界了,是那行出问题了。
cming 2001-07-21
  • 打赏
  • 举报
回复
太长不看了
pearl_091278 2001-07-21
  • 打赏
  • 举报
回复
哎呀,程序还好的拉,不算长,各位GG,千万不要害怕,第一个PerformancePaint.java,其实没什么用,只是用于求Y坐标的最大值的,你们只要好好看看PerformanceDraw.java。图的实现就是在这个类中的,帮帮忙,我真的是好烦的,今天早上看到只有7个人看过我的问题,好伤心的,怎么就没有人好好回答我呀!!!!!!!GG们发发善心拉!!!!!
pearl_091278 2001-07-21
  • 打赏
  • 举报
回复
GG们啊~~~~~~~~~~~~~~~~~~~~~~哎!

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧