我已经完成了一个小程序,但遇到了一个我无法找到解决方案的错误。
我的目标是通过触发单击将创建的对象(从 JPanel 扩展的 BlockObject )添加到列表(使用 ArrayList )中,然后能够读取列表以将其打印在屏幕上,但在读取此类列表时我得到 ArrayOutOfBoundsException。
我一直在调试并找到了问题的原因,我不知道为什么,我创建并添加到它的每个对象都检索最新类型(前面解释过)而不是创建它的那个。
沿着列表运行的代码是
public void ListBlock(){
BlockObject auxb;
Point auxp;
for(int i = 0; i < list.size(); i++){
auxb = list.get( i );
if( auxb.getType() != 0 ){
auxp = list.get( i ).limitBounds( 0, list.get( i - 1 ).getHeight() );
auxb.setBounds( ( int ) auxp.getX(), ( int ) auxp.getY(), GlobalDataStorage.StatementWidth, GlobalDataStorage.StatementHeight );
}
add( auxb );
}
}
麻烦说这是因为它总是处于 if() 条件,所以即使是第一个元素也需要前一个元素(这是 OutOfBounds 的原因),但是每个时刻里面已经有一个元素类型为 0 可以跳转它,其余的进入它:
list = new ArrayList<BlockObject>();
startingBlock = new BlockObject( 0 );
那里的类型是 0,但它会按照前面的解释发生变化,这是不应该发生的,也不知道为什么会发生。
添加了以下元素:
public void mouseClicked( MouseEvent evt ) {
point = new Point( evt.getX(), evt.getY() );;
if( ( findComponentAt( point ) instanceof BlockObject ) && ( StatementPanel.getType() != 0 ) ){
list.add( new BlockObject( StatementPanel.getType() ) );
ListBlock();
revalidate();
repaint();
}
}
BlockObject 创建时的类型保存在一个变量中,并且它应该不会改变,所以我认为每个创建都会用一个值保存在列表中,但它会不断更改在 StatementPanel 新叶时创建的所有先前对象它被选中(StatementPanel 它是在 JTree 之后实现的,每个叶子都有不同的类型)。虽然这可能是获取类型的静态方法,但添加不同的方法不起作用。
也许问题很明显,我看不到。