le graphique s'efface derrière un menu ou une autre fenêtre. comment garde le graphique permanent. l'énoncé de l'exercice donne cet indice:
Image img=new BufferedImage(200,200,BufferedImage.TYPE_INT_RGB);
Graphics imgGraph=img.getGraphics();
public void paintComponent(Graphics g){
super.paintComponent(g);
g.drawImage(img,0,0,this);
}
fichier: DeVinci2.java
-------------------------------------------------
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.colorchooser.*;
// application de dessin basique
public class DeVinci2 extends JFrame implements MouseMotionListener,ActionListener
{
private int xPrec, yPrec;
private JPanel p;
private JMenu menu;
private JMenuBar menuBar;
private JMenuItem couleurArticle,effacerArticle,quitterArticle;
private Color currCol;
private JColorChooser tcc;
public static void main(String args[])
{
new DeVinci2();
}
public DeVinci2() {
super("Un petit programme de dessin DeVinci 2");
p=new JPanel();
p.addMouseMotionListener(this);
// instenciation du menu et ses articles
menuBar=new JMenuBar();
setJMenuBar(menuBar);
//p.add(menuBar);
menu=new JMenu("Outils");
couleurArticle=new JMenuItem("Couleur...");
menu.add(couleurArticle);
couleurArticle.addActionListener(this);
effacerArticle=new JMenuItem("Effacer");
menu.add(effacerArticle);
effacerArticle.addActionListener(this);
menu.addSeparator();
quitterArticle=new JMenuItem("Quitter");
menu.add(quitterArticle);
quitterArticle.addActionListener(this);
menuBar.add(menu);
//Set up color chooser for setting text color
//tcc = new JColorChooser(banner.getForeground());
tcc = new JColorChooser(Color.BLUE);
//tcc.getSelectionModel().addChangeListener(this);
tcc.setBorder(BorderFactory.createTitledBorder("Choose Text Color"));
//tcc.setVisible(false);
this.getContentPane().add(p);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(600,600);
//this.pack();
this.setLocationRelativeTo(null);
this.setVisible(true);
}
// méthode de l'interface (MouseMotionListener) implementée par la classe courrante
// elle DOIT donc être déclarée
// elle définit les actions à executer par l'écouteur au moment des événements capturés
public void mouseDragged(MouseEvent e) { // le curseur est glissé (avec un bouton enfoncé)
Graphics g=p.getGraphics();
g.setColor(this.currCol);
g.drawLine(xPrec, yPrec,e.getX(),e.getY()); // trace une ligne entre 2 porsistion du curseur enfoncé
this.mouseMoved(e);
}
// définit les actions à executer quand le bouton (gauche ou droite) de la souris est relaché
public void mouseMoved(MouseEvent e) { // le curseur est déplacé
xPrec=e.getX(); // capture de la position X du curseur
yPrec=e.getY(); // capture de la position Y du curseur
}
// on définit les actions à executer par l'écouteur au moment des événements capturés
public void actionPerformed(ActionEvent e) {
if (e.getSource().equals(this.couleurArticle)) {
// affiche un dialogue de selection d'une couleur
this.currCol=this.tcc.showDialog(couleurArticle,"choisir une couleur",this.currCol);
}
if (e.getSource().equals(this.effacerArticle)) {
//??? code pour effacer le graphique du JPanel ;
}
if (e.getSource().equals(this.quitterArticle)) {
System.exit(0); // quitte le programme courant
}
}
}