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 :
Puis, je dessine le fond et les villes sur un JPanel :
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);
Enseuite, j'ai une classe Vitre qui étend JComponent :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 pan = new JPanel(); lyp.add(pan, new Integer(0));
C'est sur la vitre que je place le JLabel.
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);
Je surcharge la méthode paint de l'applet et je redessine le fond et les villes :
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 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 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.
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); } }
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 ?
Partager