我有一个对象列表,我想放在JTable中。下面的地图有一个索引作为键,一个数组作为值。整数数组的第一个元素是行号,第二个是列号:
mStartLocationMap = new HashMap<Integer, int[]>(); // private static
mStartLocationMap.put(1,new int[]{0,0});
mStartLocationMap.put(2,new int[]{1,0});
mStartLocationMap.put(3,new int[]{0,1});
mStartLocationMap.put(4,new int[]{1,1});
根据我获得的索引,我会检索相应的起始位置。该表是16行X 24列。然而,逻辑是这样的,无论起始位置是什么,我拥有的对象的arraylist,每个对象必须放在每个其他单元格中,直到我到达列的末尾。然后,行也每隔一行递增。以下是最终产品应该是什么样的(当我的列表中包含96个元素并且下面的代码发布时,这是完成的:
这是我的代码:
// rowStart and colStart can be 0 or 1
int counter = 0;
for(int row=rowStart; row<rowCount ;row=row+2) // rowcount =16
{
for(int col=colStart; col<colCount; col=col+2) // colcount=24
{
// myObjs is an ArrayList that contains 96 or less elements. This line throws the exception
MyObject temp = myObjs.get(counter);
myTable.setValueAt(temp,row,col);
counter++;
}
}
我知道这种方式不起作用,但我不确定如何在不抛出ArrayIndexOutOfBoundsException
的情况下填充此模式中的表格。我知道哪一行引发了错误,但我无法找到另一种方法来实现我想要的 - 即将列表中的所有对象设置到表中,无论列表的大小是多少。
有人能指出我正确的方向吗?
谢谢!
答案 0 :(得分:1)
所以如果你的小于96,你想要的是:
┌─┬─┬─┬─┬─┬─┬─┬─┐
│*│ │*│ │*│ │*│ │
├─┼─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┼─┤
│*│ │*│ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │ │
└─┴─┴─┴─┴─┴─┴─┴─┘
在这种情况下,您循环使用列表并调整当前的行和列,而不是相反:
int row = rowStart;
int col = colStart;
for( MyObject temp : myObjs ) {
myTable.setValueAt(temp,row,col);
col+=2;
if ( col >= colCount ) {
col = colStart;
row+=2;
}
}
基本上,您从rowStart
和colStart
开始。对于列表中的每个值,将其添加到表中,然后计算下一个位置。首先,转到下一列。如果您发现已超出列数,则需要转到下一行。您再次将列调整为第一列,然后更新您的行。
您不需要检查行的限制,因为您的列表中不应包含比表中更多的元素。
答案 1 :(得分:0)
你可能会在这一行得到例外:
MyObject temp = myObjs.get(counter);
由于您的数组列表为空,并且您尝试访问第0个元素。