2011-10-12 56 views
-1

我想问一个关于arraylist的问题。在我的程序中,我定义了一个数组列表和一个用户定义的对象。问题是,当我想向这个数组列表添加一个对象时,它会添加对象,但下一次当我将不同的值赋予用户对象时,它会将之前添加的旧对象的值设置为新对象。我的意思是,例如,我的旧对象中有13个,新对象是14,这使得旧对象14。我找不到解决方案。我正在研究一个绘图程序。我发布了一些代码部分。错误的设置arraylist

 public class Tester extends JPanel implements MouseMotionListener, MouseListener { 

ArrayList<Lines> array = new ArrayList<Lines>(); 
    Lines l1; 
     ... 
    public Tester(){ 
    l1 = new Lines(); 
    l1.point1 = new Point(); 
    l1.point2 = new Point(); 
    l1.denklem = new int[3]; 

而且THI是我怎么添加对象变成ArrayList中

  else if(lineci == true){ 
     if(mouseclicks == 0){ 
      l1.point1.x = e.getX(); 
      l1.point1.y = e.getY(); 
      statusBar.setText(String.format("Clicked at [%d, %d]", 
        e.getX(), e.getY())); 
      mouseclicks++; 
      starter = false; 
     } 
     else if(mouseclicks == 1){ 
      l1.point2.x = e.getX(); 
      l1.point2.y = e.getY(); 
      statusBar.setText(String.format("Clicked at [%d, %d]", 
        e.getX(), e.getY())); 
      mouseclicks = 0; 
      int a = l1.point2.y - l1.point1.y; 
      int b = l1.point1.x - l1.point2.x; 
      int c = (l1.point2.x * l1.point1.y) - (l1.point1.x * l1.point2.y); 
      l1.denklem[0] = a; 
      l1.denklem[1] = b; 
      l1.denklem[2] = c; 

      array.add(l1); 
     // array3.add(l1); 
      repaint(); 
     } 

    } 

当我点击鼠标,如果lineci是真实的,它吸引,如点线。当我打印arraylist的元素时,总是会留下最后一行。如果我绘制10行,阵列列表的10个元素是相同的。它从不保留ArrayList中的旧值。顺便说一下,布尔启动器并不重要。我只是忘了删除它。

+0

Downvoter:护理评论?对我来说这似乎是一个合法的问题。 – Adamski

回答

1

您只需添加同一对象重复到列表中。每次加入到列表中仅添加参考相同的对象:l1。因此,当您更新l1的状态时,旧的“对象”也会发生更改。

为了纠正这一点,你需要为每个要执行另外创建Lines一个新的实例。

0

使用l1.clone()在更改内部值之前,如果您想要保持所有值相同,但一个和类是可克隆的或创建一个更适合您的情况的新对象。

+0

我不同意 - 为什么只克隆()现有对象才能完全改变状态?最好创建一个全新的线路IMO实例。 – Adamski

+0

是的,我添加了额外的信息。如果你需要保留一个对象中的所有值但改变它,那么克隆效果会更好。对于这种情况,正如你所说,新对象更好。 – fmucar

+1

我认为这会抛出一个异常,如果线类不可克隆 – Genjuro

0

您引用的是原始对象l1,因此它会修改原始对象l1 - 无论它是否在列表中。

如果你想创建一个新的对象,创建新的对象

0

我觉得你的L1基准仍然指向添加到ArrayList以前的对象,你应该尽快覆盖引用作为你的对象添加到ArrayList。

通过两种

l1 = new Lines(); 

l1 = null;