添加到列表中的已创建对象的问题

时间:2012-12-01 20:43:48

标签: java swing

我正在通过一个小程序并得到一个我无法找到解决方案的错误。

我的目标是通过触发点击添加到列表(使用ArrayList)创建的对象(从JPanel扩展的BlockObject)创建,然后能够读取列表以在屏幕上打印它,但是在阅读这样的列表我得到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之后实现的,每个叶子都是不同的类型)。 虽然这可能是获取类型的静态方法,但是没有添加不同的方法。

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

1 个答案:

答案 0 :(得分:1)

我认为你有这个问题:

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

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

相关问题