0

我已经完成了一个小程序,但遇到了一个我无法找到解决方案的错误。

我的目标是通过触发单击将创建的对象(从 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 之后实现的,每个叶子都有不同的类型)。虽然这可能是获取类型的静态方法,但添加不同的方法不起作用。

也许问题很明显,我看不到。

4

1 回答 1

1

我假设你有这个问题:

Example e = new Example();
e.ChangeValue("e");
List<Example> examples = new List<Example>();
examples.add(e);
e.ChangeValue("e2");
examples.add(e);

这样做的问题是,如果您将 e 添加到列表中,它只会创建对该对象的引用,并且添加到列表中的两个引用都指向相同的引用(因此更改一个也会更改另一个),对此的解决方案是 Create一个新对象一个新示例并将其值复制到其中,这样您就不会遇到引用问题并且一次只能更改一个

于 2012-12-01T21:14:29.423 回答