Bonjour, je suis novice en java, et j'aurais besoin de vos lumières afin de m'éclairer sur la/les erreur(s) que j'ai pu faire.

Objectif :


Je souhaite créer un composant Goutte, qui me permet de faire l'animation d'une goutte d'eau qui tombe sur la surface de l'eau.
Cette animation consiste à créer une série de cercles concentrique se propagent du centre vers l'extérieur du cercle.

Code :

Pour ce faire j'ai créer une classe Cercle qui permet de dessiner un cercle plein ou vide.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
 
 
public class Cercle extends JPanel{
 
	private int x;
	private int y;
	private int r;
	private Color couleur;
	private Boolean type; // true : cercle rempli | false :  cercle avec contour 
 
	//constructeur de l'objet cercle
 
	public Cercle(){
 
	}
 
	public Cercle(int x, int y, int r, Color couleur,boolean type){
		this.x = x;
		this.y = y;
		this.r = r;
		this.couleur = couleur;
		this.type = type;
	}
 
	public void update(Graphics g){
		paint(g);
	}
 
	//dessiner un cercle dans un contexte graphic
	public void paint(Graphics g){   
		Graphics2D g2 = (Graphics2D) g;
		g2.setColor(couleur);			// on met la couleur 
		if(type){
			g2.fillOval(x-r, y-r, 2*r, 2*r);	// on dessine un cercle plein 
		}else{
			g2.drawOval(x-r, y-r, 2*r, 2*r);	// on dessine un cercle vide 
		}
 
	}
 
      //Getters et setters ... 
}
J'ai ensuite créer une classe Goutte qui me permet de faire mon animation. J'ai également mis un listener sur le clique de souris, afin d'ajouter à chaque clique, un cercle à ma liste de cercle de propagation. Le main permettant de lancer l'animation et aussi incluse dans la classe Goutte.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
 
 
public class Goutte extends JComponent implements MouseListener {
 
 
	private static final long serialVersionUID = 1L;
 
	private int x;
	private int y;
	private int r;
	private Color couleur;
 	private Cercle c1; 			//contour exterieur de la goutte
	private ArrayList<Cercle> lst_cercle;	// liste des cercles de progation
	private Cercle c3; 			// cercle qui permet d'effacer les précédents cercles déssinés  
 
	private Thread t = null;
 
	//constructeurs	
	public Goutte(){
		super();		
	}
 
	public Goutte(int x, int y, int r, Color couleur){
		super();	
		this.x= x;
		this.y = y;
		this.r = r;
		this.c1 = new Cercle(x,y,r,Color.black,false);//contour exterieur de la goutte		
		lst_cercle = new ArrayList<Cercle>();
		lst_cercle.add(new Cercle(x,y,0,couleur,false));			
		this.c3 = new Cercle(x,y,r,Color.white,true);
		this.addMouseListener(this);
	}
        //affichage des cercles
	public void paint(Graphics g){		
		c3.update(g);		//on commence par effacer
		Iterator<Cercle> it = lst_cercle.iterator();
		int i =0;
		while(it.hasNext()){
			System.out.println("aff cercle num : "+ i);
			Cercle c = (Cercle) it.next();
			c.update(g);	//on dessine les cercles
			i++;
		}
		c1.update(g);		//on dessine le contour
	}
 
	//ajoute un cercle à la liste des cercles
	public void ajouterCercle(){
			this.getLst_cercle().add(new Cercle(x,y,0,couleur,false));
			//on ne lance un nouveau thread que s'il n'existe pas encore ou s'il est terminé
			if(t== null || t.getState()==Thread.State.TERMINATED){
				t = new Thread(new Runnable() {
				      public void run() {	
				    	  affichageGoutte();
				      }
					});
				t.start();	
			}	
	}
 
	//affiche les cercles présent dans la liste et les supprime quand ils ont atteint leurs tailles max
	public void affichageGoutte(){
		System.out.println("affichage goute");
			int i=0;						
				while(!lst_cercle.isEmpty()){
					Iterator<Cercle> it = lst_cercle.iterator();
					i=0;
					while(it.hasNext()){						
						Cercle c = (Cercle) it.next();
						if(c.getR() < r){//si la taille du cercle est inférieur à la taille de la goutte  
							c.setR(c.getR()+1);		//modification du diamètre
						}else{ //sinon on supprime le cercle de la liste
							it.remove();
							System.out.println("supprime de la liste le "+i+" elt");
						}
						i++;
					}
					this.repaint();//affichage des modifications
					//attente
					try {
						Thread.sleep(250);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
 
	}
 
	@Override
	public void mouseClicked(MouseEvent arg0) {
		// TODO Auto-generated method stub		
		System.out.println("Mouse Clicked");
		ajouterCercle();		
	}
 
	public static void main(String[] args) {
		// TODO Auto-generated method stub
			JFrame jf =new JFrame();			
			Goutte gr = new Goutte(50,30,15,Color.red);
			System.out.println("programme lancé");
			jf.setSize(200, 200);			
 
			jf.add(gr);
			jf.setLocationRelativeTo(null);
			jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
			jf.setVisible(true);
 
	}
Problème :

Mon problème, c'est qu'une fois que mon premier cercle de propagation atteint la taille de ma goutte, je la supprime de ma liste (ligne 74 dans la Classe Goutte), et c'est alors que l'affichage de mes cercles de propagation s'arrête. Et Pourtant la console m'affiche que le traitement s'effectue bien.

Si vous avez déjà rencontré ce problème, ou si vous avez une idée de la source du problème je vous en serais éternellement reconnaissant.

De plus si selon vous il y a des aberrations d'un point de vue conception, ou si il y a des usages à respecter pour la création des composants graphiques, je suis également preneur.