2010-10-17 13 views
1

Je ne suis pas sûr de ce qui ne va pas mais il y a quelque chose d'étrange dans mon Paint() concernant certaines variables.Incohérence variable de la méthode Java Awt Paint

ce code fonctionne très bien:

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

mais celui-ci ne pas, je voulais celui-ci, car im changeant les formations de position sur la sélection de l'utilisateur:

// 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

Qu'est-ce exactement fonctionne pas? –

+0

il semble que la variable selectedFormation dérange sur la première boucle de Paint(). Cependant, je change les 'positions', je veux qu'à chaque fois que Paint() commence, les 'positions' commencent avec la 'selectedFormation' donnée. – Albert

+0

lorsque Paint est appelé une deuxième fois, la valeur selectedFormation transmise sur 'positions' est différente. même si je n'ai pas touché à la sélection. – Albert

Répondre

2

lorsque vous vous positions = selectedFormation ne créez pas une copie de selectedFormation, vous n'enregistrez qu'une référence en position. Les deux pointent vers le même objet (le même tableau). Si le tableau est modifié en utilisant position, il s'agit du même tableau que selectedFormation.
Utilisez clone() pour créer une copie du tableau:

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

mais considèrent que clone ne copie pas les éléments du tableau, à la fois la liste contiendra les mêmes instances. Si vous modifiez uniquement les coordonnées d'un point, cela affectera les deux listes. Dans ce cas, vous devez faire une copie en profondeur de la liste:

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; 
} 

pourrait utiliser la généralisation pour cela ... mais permet de garder les choses simples

+0

Merci, je suis maintenant en utilisant ArrayCopy, pensez-vous que c'est la meilleure façon? – Albert

+0

ne savez pas ce qu'est ArrayCopy ... ou voulez-vous dire 'System.arraycopy (...)'? –

+0

yup, mais je suis passé à deepCopy :) merci beaucoup! – Albert