Bonjour

j'ai une applet qui affiche :
  • un fond de carte (images)
  • des villes (des disques dessinés par parcours d'une List de données)
  • un petit texte au survol des villes par la souris

J'aimerais bien que quand on déplace la souris on puisse afficher l'étiquette (nom de la ville, infos...) sans pour autant redessiner le fond de carte et toutes les villes !.
Je me suis documenté et j'ai utilisé un JLayeredPane.
D'où, dans l'applet :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
lyp = new JLayeredPane();
lyp.setLayout(null);
lyp.setSize(700,650);
lyp.setOpaque(false);
this.getContentPane().add(lyp);
Puis, je dessine le fond et les villes sur un JPanel :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
 
pan = new JPanel();
lyp.add(pan, new Integer(0));
Enseuite, j'ai une classe Vitre qui étend JComponent :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
 
vitre = new Vitre();
lyp.add(vitre, new Integer(1));
vitre.setOpaque(false);
C'est sur la vitre que je place le JLabel.

Je surcharge la méthode paint de l'applet et je redessine le fond et les villes :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
 
public void paint(Graphics g) {
		super.paint(g);
//si le fond est arrivé on le place
		if (img != null)
			pan.getGraphics().drawImage(img, 0, 0, this);
//dessinateur redessine les villes sur pan
		dessinateur.toutRedessiner();
}
Et dans la classe Vitre, qui étend JComponent, je surcharge paintComponent pour placer mon composant
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
 
@Override
	public void paintComponent(Graphics g) {
		super.paintComponent(g);
		if (texte != null) {
			etiquette.setText(texte);
			etiquette.setBounds(xTexte, yTexte,
					etiquette.getPreferredSize().width, etiquette
							.getPreferredSize().height);
 
			etiquette.setVisible(true);
		} else {
			etiquette.setVisible(false);
		}
	}
Et bien, je m'imaginais que je pourrais appeler vitre.repaint() pour ne rafraîchir que le premier plan sans devoir redessiner le fond. Or si je fais ça mon applet est recouvert par une sorte de couche qui a la couleur du fond par défaut.

Je constate que ça ne marche que si j'appelle repaint sur toute l'applet. Du coup, tout est redessiné, y compris le fond, les villes sont toutes replacées.
Mais ça fait une sorte de balayage inesthétique.
Donc, comment faire pour ne rafraîchir que la vitre ? Est-ce possible ?