Changer couleur image avec souris

moreelsc Messages postés 20 Date d'inscription jeudi 15 avril 2010 Statut Membre Dernière intervention 18 mai 2010 - 15 avril 2010 à 11:51
moreelsc Messages postés 20 Date d'inscription jeudi 15 avril 2010 Statut Membre Dernière intervention 18 mai 2010 - 15 avril 2010 à 18:18
Bonjour,

J'aimerais créer un petit programme simple:
Je crée une fenêtre comportant une image (un simple rectangle rouge).
J'aimerais via un MouseListener faire en sorte que lorsque je clic sur l'image, celle-ci devienne verte.
Mon problème est que je dessine l'image dans une classe interne (MonImage) qui étend JPanel et utilise des Graphics. Or, dans la méthode drawImage, il faut utiliser "this".
Je ne peut donc pas modifier la couleur de l'image via ma classe Event (qui s'occupe de la souris)???

Autre question: lorsque je modifie le nom de la méthode "paint" de la classe MonImage, l'image n'est plus peinte en rouge. Pourquoi faut-il absolument donner ce nom à la méthode?

Voici mon code, je vous remercie d'avance pour votre aide.

package Main_package;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Test {
private JFrame frame;
private Image img;
public MonImage image = new MonImage();

public Test()
{
frame = new JFrame ("Test");
try
{
img=ImageIO.read(new File("C:/Documents and Settings/User/Mes documents/carrés.JPG"));
}
catch (IOException e)
{
System.out.println("Erreur de chargement de l'image");
}
frame.add(image);
frame.setSize(529,266);
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
frame.setVisible(true);
}
public class MonImage extends JPanel
{
public void paint (Graphics g)
{
g.drawImage(img,0, 0, this.getWidth(), this.getHeight(), this);
g.setColor(Color.RED);
g.fillRect(0, 0, 530, 530);
}

// Créer ici une méthode paintGreen(Graphics g)???
}
public class Events extends MouseAdapter
{
public void MouseClicked(MouseEvent e)
{
//Que mettre ici???

}

}
public static void main (String [] args)
{
new Test();
}
}

9 réponses

cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
15 avril 2010 à 12:22
Salut,

Pourquoi faut-il absolument donner ce nom à la méthode


Parce que si tu change de nom, tu ne surcharge plus la méthode paint (d'ailleurs, tu ferais mieux de surcharger la méthode paintComponent plutôt que paint !), et du coup, ta méthode renommée n'est plus appelée par java pour tracer sur ton panel !

Pour ton problème de this, il te suffit de récupérer la source de l'événement :
public class Events extends MouseAdapter 
{ 

public Events(
public void MouseClicked(MouseEvent e) 
{ 
if (e.getSource() == image) {
  ((MonImage) e.getSource()).setColor(Color.GREEN); // ici tu appelle ta méthode pour modifier la couleur de tracé
}
} 
} 

______________________________________

AVANT de poster votre message, veuillez lire, comprendre, et appliquer notre réglement
0
moreelsc Messages postés 20 Date d'inscription jeudi 15 avril 2010 Statut Membre Dernière intervention 18 mai 2010
15 avril 2010 à 17:00
Ok merci je comprend mais il y a une erreur de compilation.
"the method setColor is undefined for the type Test.MonImage"

La méthode setColor n'est pas héritée du JPanel? C'est bizare...
J'ai regardé dans la librairie standard. Apparement setColor() appartient à la classe abstraite Graphics et non JPanel... Comment accéder au Graphics de image alors?

et il faut aussi ajouter image.addMouseListener(new Events()) je présume?

merci encore
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
15 avril 2010 à 17:07
Salut,

Oui, il faut rajouter le listener à ta classe MonImage.

Par contre, pour la fonction setColor, c'était pour l'exemple (d'où mon commentaire) : il faut appeler la méthode de ta classe MonImage qui te permet de lui dire quelle couleur utiliser pour le tracer (et la créer si jamais tu n'en a pas fait).
______________________________________

AVANT de poster votre message, veuillez lire, comprendre, et appliquer notre réglement
0
moreelsc Messages postés 20 Date d'inscription jeudi 15 avril 2010 Statut Membre Dernière intervention 18 mai 2010
15 avril 2010 à 17:20
Ok mais alors je ne suis pas beaucoup plus avancé puisque je ne sais pas comment modifier la couleur d'une Image depuis l'extérieur de la méthode paint().


Pfff je m'en sors pas avec les Graphics:(
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
moreelsc Messages postés 20 Date d'inscription jeudi 15 avril 2010 Statut Membre Dernière intervention 18 mai 2010
15 avril 2010 à 17:24
J'essaie ceci:
public void setColor(Color c)
{
this.image.getGraphics().drawImage(img,0,0,image.getWidth(), image.getHeight(), image);
this.image.getGraphics().setColor(c);
this.image.getGraphics().fillRect(0, 0, 530, 530);
}

Mais cela ne fait rien...
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
15 avril 2010 à 17:37
Salut,

public class MonImage extends JPanel 
{ 

private Color couleur;

public void setColor(Color couleur) {
this.couleur = couleur;
}

public void paint (Graphics g) 
{ 
g.drawImage(img,0, 0, this.getWidth(), this.getHeight(), this); 
g.setColor(couleur); 
g.fillRect(0, 0, 530, 530); 
} 


______________________________________

AVANT de poster votre message, veuillez lire, comprendre, et appliquer notre réglement
0
moreelsc Messages postés 20 Date d'inscription jeudi 15 avril 2010 Statut Membre Dernière intervention 18 mai 2010
15 avril 2010 à 17:56
Toujours rien qui ne se produit avec ce code...
public class MonImage extends JPanel
{
private Color couleur = Color.RED; //initialement rouge
public void setColor(Color c)
{
couleur = c;
}
public void paint (Graphics g)
    {
    	g.drawImage(img,0, 0, this.getWidth(), this.getHeight(), this);
    g.setColor(couleur);
    g.fillRect(0, 0, 530, 530);
}


}
public class Events extends MouseAdapter
{
public void MouseClicked(MouseEvent e)
{
if (e.getSource() == image) 
{
((MonImage) e.getSource()).setColor(Color.GREEN); // ici tu appelle ta méthode pour modifier la couleur de tracé
    ((MonImage)e.getSource()).repaint(); //Je refais un appel à paint() avec la couleur modifiée
}
}
}
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
15 avril 2010 à 18:11
Salut,

Il te faut surcharger la méthode paintComponent (je te l'avais déjà plus haut).

public class MonImage extends JPanel
{
private Color couleur = Color.RED; //initialement rouge
public void setColor(Color c)
{
couleur = c;
}
public void paintComponent(Graphics g)
    {
                    super.paintComponent(g);
                    g.setColor(couleur);
    g.fillRect(0, 0, 530, 530);
}


}
public class Events extends MouseAdapter
{
public void MouseClicked(MouseEvent e)
{
if (e.getSource() == image) 
{
    ((MonImage) e.getSource()).setColor(Color.GREEN);
    ((MonImage)e.getSource()).repaint();
}
}
}


Un petit tutoriel en passant.
______________________________________

AVANT de poster votre message, veuillez lire, comprendre, et appliquer notre réglement
0
moreelsc Messages postés 20 Date d'inscription jeudi 15 avril 2010 Statut Membre Dernière intervention 18 mai 2010
15 avril 2010 à 18:18
Si j'utilise paintComponent() à la place de paint(), mon image ne s'affiche plus. De plus, toujours aucun changement de couleur avec ton code lors du clic...

Merci pour le tuto, j'vais y jeter un coup d'oeil, ca me sera sûrement utile.
0
Rejoignez-nous