Bonjour/soir,

Je programme un petit jeu pour renouer avec le plaisir de programmer.

Le programme est composé de deux panels/classes :
-un panel où s'exécute le jeu
-un panel de "game over" qui dure quelques secondes

L'application commence donc avec le panel de jeu puis quand le joueur perd,
le panel de game over apparaît avant de laisser réapparaître le panel de jeu.

Mon soucis est que le panel de jeu a des listeners en classe interne et que ces dernières
n'écoutent plus quand je passe par le panel de game over.
Je dois quitter l'application sans la fermer puis y retourner pour que les listeners remarchent...
(double alt-tab)

J'aimerais comprendre mon erreur et faire comprendre à ma classe implémentant jframe de répercuté
les signaux pour les listeners directement snas cette manoeuvre.

Voici le code de la classe gérant la JFrame :

Je gère le changement de panel avec les méthodes end() et begin().

J'utilise bien revalidate() pour les changements de panel et normalement le garbage doit supprimer mes panels au fur et à mesure.

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
 
public class GameManager extends JFrame{
 
	private static final long serialVersionUID = 1L;
	private GameCanvas panel;
 
	public GameManager(){
		setName("BooGon");
		setSize(804,426);
		setResizable(false);
		setBackground(Color.black);
	    this.setLocationRelativeTo(null);
	    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	    panel=new TestCanvas(this);
		setContentPane(panel);
		this.validate();
		setVisible(true);
	}
 
	/* chargement d'un panel game over */
	public void end(){
		this.remove(panel);
		panel=new EndPanel(this);
		setContentPane(panel);
		this.revalidate();
	}
 
	/*rechergament d'un panel de jeu. */
	public void begin(){
		this.remove(panel);
	    panel=new TestCanvas(this);
		setContentPane(panel);
		this.revalidate();
	}
}



et voici une partie du code du panel de jeu :

J'initialise la boucle et les listeners dans le constructeur.
Je vous montre paintComponent car j'y arrête la boucle et nettoie le panel.

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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
 
public class TestCanvas extends GameCanvas {
 
	public static final int Z_indice = 0;
	public static final int Q_indice = 1;
	public static final int S_indice = 2;
	public static final int D_indice = 3;
	public static final int Espace_indice = 4;
	private static final long serialVersionUID = 1L;
	int width,height,cmptE,intervE;
	ArrayList<Projectile> projectiles;
	ArrayList<Entite> ennemies;
	Vaisseau v;
	Level monde;
	Timer timer;
	int[][] decor;
	GameManager gm;
	boolean wait;
	KeyListener key;
	MouseListener mouse;
 
	protected TestCanvas(GameManager g){
		wait=false;
		gm=g;
		intervE=48;
		cmptE=intervE;
		decor=new int[21][40];
		v=new Vaisseau(200,200,this);
		ennemies=new ArrayList<Entite>();
		ennemies.add(new Ennemy(800,200,20,30,-3,this,10,100));
		projectiles=new ArrayList<Projectile>();
		width=800;
		height=400;
		setSize(getWidth(), getHeight());
		setBackground(Color.blue);
		setActif(true);
		setFocusable(true);
		mouse=new MouseListener(){
			public void mouseClicked(MouseEvent arg0) {}
			public void mouseEntered(MouseEvent arg0) {
				setActif(true);
			}
			public void mouseExited(MouseEvent arg0) {
				setActif(false);		
			}
			public void mousePressed(MouseEvent e) {}
			public void mouseReleased(MouseEvent arg0) {}
		};
		this.addMouseListener(mouse);
		key=new KeyListener(){
			public void keyPressed(KeyEvent e) {
				if(e.getKeyChar()=='z'){
					v.setTouche(Z_indice, true);
				}
				else if(e.getKeyChar()=='q'){
					v.setTouche(Q_indice, true);
				}
				else if(e.getKeyChar()=='s'){
					v.setTouche(S_indice, true);
				}
				else if(e.getKeyChar()=='d'){
					v.setTouche(D_indice, true);
				}
				else if(e.getKeyChar()==' '){
					v.setTouche(Espace_indice, true);
					wait=true;
				}
			}
			public void keyReleased(KeyEvent e) {
				if(e.getKeyChar()=='z'){
					v.setTouche(Z_indice, false);
				}
				else if(e.getKeyChar()=='q'){
					v.setTouche(Q_indice, false);
				}
				else if(e.getKeyChar()=='s'){
					v.setTouche(S_indice, false);
				}
				else if(e.getKeyChar()=='d'){
					v.setTouche(D_indice, false);
				}
				else if(e.getKeyChar()==' '){
					v.setTouche(Espace_indice, false);
				}
			}
			public void keyTyped(KeyEvent e) {}
			};
		this.addKeyListener(key);
		timer = new Timer();
		timer.purge();
		timer.schedule(new TimerTask(){
			public void run(){
				if(getActif()&&wait){
					TestCanvas.this.actions();
					TestCanvas.this.collisions();
					TestCanvas.this.repaint();
					if(cmptE==0){
						cmptE=intervE;
						ennemies.add(new Ennemy(800,(int)(Math.random()*370.0),20,30,-3,TestCanvas.this,10,100));
					}
					else{
						cmptE--;
					}
				}
			}
		},0,40);
	}
 
	public void paintComponent(Graphics g) {
		int i;
		Graphics2D graph=(Graphics2D)g;
		graph.setBackground(Color.black);
		graph.clearRect(0, 0, 800,400);
		v.paint(graph);
		if(v.isAlive()){
			for(i=projectiles.size()-1;i>-1;i--)
				if(projectiles.get(i).isAlive()){
					projectiles.get(i).paint(graph);
				}
				else
					projectiles.remove(i);
			for(i=ennemies.size()-1;i>-1;i--)
				if(ennemies.get(i).isAlive()){
					ennemies.get(i).paint(graph);
				}
				else
					ennemies.remove(i);
		}
		else{
			setActif(false);
			timer.cancel();
			removeKeyListener(key);
			removeMouseListener(mouse);
			ennemies.clear();
			projectiles.clear();
			setFocusable(false);                        
			gm.end();
		}
	}
}
Si quelqu'un pouvait m'expliquer mon erreur s'il vous plaît.

Mokuhiken