Modifier un élement de premier plan sans tout redessiner
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:
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:
1 2 3
|
pan = new JPanel();
lyp.add(pan, new Integer(0)); |
Enseuite, j'ai une classe Vitre qui étend JComponent :
Code:
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:
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:
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 ?