J'ai regardé ce code toute la journée, mais je n'y arrive pas.
En ce qui concerne l'ATM, je ne fais que pousser des blocs de code dans tous les sens sans pouvoir me concentrer, avec un délai de près d'une heure... Vous êtes donc mon dernier recours.
Je suis censé créer quelques boules aléatoires sur un canevas, ces boules étant stockées dans un ArrayList (j'espère qu'un ArrayList convient ici : les options alternatives à choisir étaient HashSet et HashMap). Maintenant, quoi que je fasse, j'obtiens des boules de couleurs différentes en haut de mon canevas, mais elles restent coincées là et refusent de bouger. En outre, j'obtiens maintenant un ConcurrentModificationException
lors de l'exécution du code :
java.util.ConcurrentModificationException
at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372)
at java.util.AbstractList$Itr.next(AbstractList.java:343)
at BallDemo.bounce(BallDemo.java:109)
La ligne 109 étant : bBall.draw();
En me renseignant sur cette exception, j'ai découvert que l'on peut s'assurer que la liste de tableaux est accessible de manière sûre en synchronisant l'accès d'une manière ou d'une autre. Mais comme je me suis souvenu de collègues étudiants qui n'avaient pas recours à la synchronisation, je pense que ce n'est pas la bonne voie à suivre.
Peut-être pourriez-vous m'aider à faire fonctionner ce système, j'ai au moins besoin que ces stupides boules bougent ;-)
/**
* Simulate random bouncing balls
*/
public void bounce(int count)
{
int ground = 400; // position of the ground line
System.out.println(count);
myCanvas.setVisible(true);
// draw the ground
myCanvas.drawLine(50, ground, 550, ground);
// Create an ArrayList of type BouncingBalls
ArrayList<BouncingBall>balls = new ArrayList<BouncingBall>();
for (int i = 0; i < count; i++){
Random numGen = new Random();
// Creating a random color.
Color col = new Color(numGen.nextInt(256), numGen.nextInt(256), numGen.nextInt(256));
// creating a random x-coordinate for the balls
int ballXpos = numGen.nextInt(550);
BouncingBall bBall = new BouncingBall(ballXpos, 80, 20, col, ground, myCanvas);
// adding balls to the ArrayList
balls.add(bBall);
bBall.draw();
boolean finished = false;
}
for (BouncingBall bBall : balls){
bBall.move();
}
}
Il s'agit de la méthode originale non modifiée que nous a enseignée notre professeur, qui ne crée que deux boules :
/**
* Simulate two bouncing balls
*/
public void bounce()
{
int ground = 400; // position of the ground line
myCanvas.setVisible(true);
myCanvas.drawLine(50, ground, 550, ground);
// draw the ground
// crate and show the balls
BouncingBall ball = new BouncingBall(50, 50, 16, Color.blue, ground, myCanvas);
ball.draw();
BouncingBall ball2 = new BouncingBall(70, 80, 20, Color.red, ground, myCanvas);
ball2.draw();
// make them bounce
boolean finished = false;
while(!finished) {
myCanvas.wait(50); // small delay
ball.move();
ball2.move();
// stop once ball has travelled a certain distance on x axis
if(ball.getXPosition() >= 550 && ball2.getXPosition() >= 550) {
finished = true;
}
}
ball.erase();
ball2.erase();
}
}
J'ai donc modifié mon code comme suit
public void bounce(int count)
{
int ground = 400; // position of the ground line
System.out.println(count);
myCanvas.setVisible(true);
// draw the ground
myCanvas.drawLine(50, ground, 550, ground);
// Create an ArrayList of type BouncingBalls
ArrayList<BouncingBall>balls = new ArrayList<BouncingBall>();
Random numGen = new Random();
for (int i = 0; i < count; i++){
// Creating a random color.
Color col = new Color(numGen.nextInt(256), numGen.nextInt(256), numGen.nextInt(256));
// creating a random x-coordinate for the balls
int ballXpos = numGen.nextInt(550);
BouncingBall bBall = new BouncingBall(ballXpos, 80, 20, col, ground, myCanvas);
// adding balls to the ArrayList
balls.add(bBall);
bBall.draw();
}
boolean finished = false;
while(!finished)
{
myCanvas.wait(50); // small delay
for(BouncingBall ball : balls)
{
ball.move();
// once one ball has travelled the distance, they all have
if(ball.getXPosition() >= 550)
finished = true;
}
}
for(BouncingBall ball : balls)
ball.erase();
}
Mais cela ne fait que déplacer les balles très brièvement et crée ensuite la même exception que ci-dessus.