Bonjour,

j'ai un problème de saccade lors d'une animation (très simple : une balle qui bouge horizontalement) avec Swing.

Je précise que si je remplace mes JFrame et JPanel par les classes AWT Panel et Frame cela fonctionne correctement (au problème d'absence de double Buffering près).

Ma question est donc comment faire en SWING pour avoir quelquechose de fluide. Je vous poste mon code ci dessous :

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
 
import javax.swing.*;
import java.awt.*;
 
public class CasseBrique {
 
 
	public CasseBrique(){
 
		JFrame frame = new JFrame("Casse brique v1.0");
		frame.setSize(new Dimension(800,600));
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		Jeu jeu = new Jeu(100,100,2,0);
		frame.add(jeu);
		frame.setVisible(true);
		jeu.init();
	}
 
	public static void main(String[] arg){
		new CasseBrique();
	}
}
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
 
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
 
 
public class Jeu extends JPanel{
 
	private int x,y;
	private int vx,vy;
	private Timer timer;
	ActionListener moveBall;
 
	public Jeu(int x, int y, int vx, int vy){
		this.x=x;
		this.y=y;
		this.vx=vx;
		this.vy=vy;
 
		moveBall = new ActionListener() {
 
			@Override
			public void actionPerformed(ActionEvent e) {
				calculerPosition();
				repaint();
			}
		};
	}
 
	public void paint(Graphics g){
		super.paint(g);
		g.fillOval(x, y, 40, 40);
	}
 
	public void init(){
		this.setBackground(Color.BLACK);
		this.setForeground(Color.BLUE);
		timer= new Timer(40, moveBall);
		timer.start();
	}
 
	private void calculerPosition() {
		if (x<0 ||x>=800-10)
			vx=-vx;
 
		if (y<0 || y>=600-10)
			vy=-vy;
 
		x+=vx;
		y+=vy;
	}
}