2010-10-17 45 views
1

我不確定什麼是錯,但是在我的Paint()中有一些關於某些變量的奇怪事件。Java Awt Paint方法的變量不一致性

此代碼的工作就好了:

public void paint(Graphics g) 
{ 
    Point[] positions = {new Point(20,50),new Point(60,30),new Point(80,20),new Point(80,30)}; 
} 

但是這一次不,我想這一次,因爲用戶的選擇IM改變位置的地層:

// declared somewhere 
Point[] selectedFormation = {new Point(20,50),new Point(60,30),new Point(80,20),new Point(80,30)}; 

public void paint(Graphics g) 
{ 
    Point[] positions = selectedFormation; 
} 
+1

究竟不起作用? – 2010-10-17 12:58:32

+0

看起來,selectedFormation變量在Paint()的第一個循環中搞砸了。儘管我確實改變了「職位」,但我希望每次Paint()開始時,'職位'從給定的'selectedFormation'開始。 – Albert 2010-10-17 13:05:44

+0

當第二次調用Paint時,在'位置'上傳遞的selectedFormation是不同的。即使我沒有碰到selectedFormation。 – Albert 2010-10-17 13:18:05

回答

2

當你做positions = selectedFormation你沒有創建selectedFormation的副本,只是將其引用存儲到位。兩者都指向同一個對象(同一個數組)。如果數組使用position進行更改,則它與selectedFormation的數組是相同的。
使用clone()創建數組的副本:

public void paint(Graphics g) 
{ 
    Point[] positions = selectedFormation.clone(); 
} 

,但考慮到clone不會複製數組中的元素,既列表將包含相同的實例。如果您只更改任何點的座標,則會影響兩個列表。在這種情況下,你需要做的名單的深層副本:

public Point[] deepCopy(Point[] array) { 
    Point[] copy = new Point[array.length]; 
    for (int i = 0; i < array.length; i++) { 
     copy[i] = new Point(array[i]); 
    } 
    return copy; 
} 

可以使用推廣這個......但讓我們保持它的簡單

+0

謝謝,我現在使用ArrayCopy,你認爲這是最好的方法嗎? – Albert 2010-10-17 13:38:49

+0

不知道ArrayCopy是什麼...或者你的意思是'System.arraycopy(...)'? – 2010-10-17 13:41:07

+0

是的,但我切換到你deepCopy :)非常感謝你! – Albert 2010-10-17 13:56:52