我收到错误ArrayOutOfBoundException: 15 at line 110
:
System.out.println(coordinates[k][l]);
尝试运行此代码时:
import TUIO.*;
TuioProcessing tuioClient;
int cols = 15, rows = 10;
boolean[][] states = new boolean[cols][rows];
String[][] coordinates = new String[cols][rows];
int videoScale = 50;
// these are some helper variables which are used
// to create scalable graphical feedback
int x, y, i, j, k, l;
float cursor_size = 15;
float object_size = 60;
float table_size = 760;
float scale_factor = 1;
PFont font;
boolean verbose = false; // print console debug messages
boolean callback = true; // updates only after callbacks
void setup(){
size(500,500);
noCursor();
noStroke();
fill(0);
// periodic updates
if (!callback) {
frameRate(60); //<>//
loop();
} else noLoop(); // or callback updates
font = createFont("Arial", 18);
scale_factor = height/table_size;
// finally we create an instance of the TuioProcessing client
// since we add "this" class as an argument the TuioProcessing class expects
// an implementation of the TUIO callback methods in this class (see below)
tuioClient = new TuioProcessing(this);
}
void draw(){
// Begin loop for columns
for ( k = 0; k < cols; k++) {
// Begin loop for rows
for ( l = 0; l < rows; l++) {
// Scaling up to draw a rectangle at (x,y)
int x = k*videoScale;
int y = l*videoScale;
fill(255);
stroke(0);
for (int i = 0; i < cols; i++) {
for (int j = 0; j < rows; j++) {
coordinates[i][j] = String.valueOf((char)(i+65)) + String.valueOf(j).toUpperCase();
}
}
/*
//check if coordinates are within a box (these are mouse x,y but could be fiducial x,y)
//simply look for bounds (left,right,top,bottom)
if( (mouseX >= x && mouseX <= x + videoScale) && //check horzontal
(mouseY >= y && mouseY <= y + videoScale)){
//coordinates are within a box, do something about it
System.out.println(coordinates[k][l]);
//you can keep track of the boxes states (contains x,y or not)
states[k][l] = true;
if(mousePressed) println(k+"/"+l);
}else{
states[k][l] = false;
}
*/
rect(x,y,videoScale,videoScale);
}
}
textFont(font,18*scale_factor);
float obj_size = object_size*scale_factor;
float cur_size = cursor_size*scale_factor;
ArrayList<TuioObject> tuioObjectList = tuioClient.getTuioObjectList();
for (int i=0;i<tuioObjectList.size();i++) {
TuioObject tobj= tuioObjectList.get(i);
stroke(0);
fill(0,0,0);
pushMatrix();
translate(tobj.getScreenX(width),tobj.getScreenY(height));
rotate(tobj.getAngle());
rect(-obj_size/2,-obj_size/2,obj_size,obj_size);
popMatrix();
fill(255);
text(""+tobj.getSymbolID(), tobj.getScreenX(width), tobj.getScreenY(height));
System.out.println(tobj.getSymbolID ()+ " " + tobj.getX());
if( ( tobj.getX()>= x && tobj.getX() <= x + videoScale) && //check horzontal
(tobj.getY() >= y && tobj.getY() <= y + videoScale)){
//coordinates are within a box, do something about it
System.out.println(coordinates[k][l]);
}
rect(x,y,videoScale,videoScale);
}
}
// --------------------------------------------------------------
// these callback methods are called whenever a TUIO event occurs
// there are three callbacks for add/set/del events for each object/cursor/blob type
// the final refresh callback marks the end of each TUIO frame
// called when an object is added to the scene
/* void addTuioObject(TuioObject tobj) {
if (verbose) println("add obj "+tobj.getSymbolID()+" ("+tobj.getSessionID()+") "+tobj.getX()+" "+tobj.getY()+" "+tobj.getAngle());
}
// called when an object is moved
void updateTuioObject (TuioObject tobj) {
if (verbose) println("set obj "+tobj.getSymbolID()+" ("+tobj.getSessionID()+") "+tobj.getX()+" "+tobj.getY());
}
// called when an object is removed from the scene
void removeTuioObject(TuioObject tobj) {
if (verbose) println("del obj "+tobj.getSymbolID()+" ("+tobj.getSessionID()+")");
}
*/
// --------------------------------------------------------------
// called at the end of each TUIO frame
void refresh(TuioTime frameTime) {
if (verbose) println("frame #"+frameTime.getFrameID()+" ("+frameTime.getTotalMilliseconds()+")");
if (callback) redraw();
}
这是否意味着它在一个比这个数组可以包含的元素数量更多的地方分配一个值?我该如何修改它?
我无法在代码中找到指定数组大小的代码。我是根据cols
和rows
创建的(15来自那里,因为当我修改它时,说4,错误变为ArrayOutOfBoundException: 4
,但即使有1也有错误,所以我没有得到它,所以我改变了这些值,但我仍然得到错误。
感谢您的帮助
答案 0 :(得分:1)
您正尝试在以下循环之外使用变量k
和l
-
for ( k = 0; k < cols; k++) {
// Begin loop for rows
for ( l = 0; l < rows; l++) {
似乎k和l在实例变量范围中定义。在上面的循环结束后,k的值是cols,l的值是行,我假设坐标的长度是(rows, cols)
。
因此,当您尝试在if
条件下打印时,您会遇到此问题 - if( ( tobj.getX()>= x && tobj.getX() <= x + videoScale) && (tobj.getY() >= y && tobj.getY() <= y + videoScale))
也许你想在k
和l`l变量的循环结束之前打印它。那是在以下几行之前 -
rect(x,y,videoScale,videoScale);
} // <-- Here 'l' loop ends.
} // <---- Here 'k' loop ends.
textFont(font,18*scale_factor);
float obj_size = object_size*scale_factor;
float cur_size = cursor_size*scale_factor;
或许你不想结束那里的k
和l
循环(我在这篇文章开头提到的那些循环)?你有没有错过评论那部分?
答案 1 :(得分:1)
变量k
的值在此for循环结束时为15
for ( k = 0; k < cols; k++) {
// Begin loop for rows
for ( l = 0; l < rows; l++) {
// Scaling up to draw a rectangle at (x,y)
int x = k*videoScale;
int y = l*videoScale;
fill(255);
stroke(0);
for (int i = 0; i < cols; i++) {
for (int j = 0; j < rows; j++) {
coordinates[i][j] = String.valueOf((char)(i+65)) + String.valueOf(j).toUpperCase();
}
}
rect(x,y,videoScale,videoScale);
}
}
然后您尝试在此行访问coordinates
索引号coordinates[15][11]
:
System.out.println(coordinates[k][l]);
这就是你获得例外的原因。
希望这有帮助。