Probleme de raffraichissement d'image

Azdruyel Messages postés 66 Date d'inscription vendredi 4 juin 2004 Statut Membre Dernière intervention 10 mai 2005 - 5 juil. 2004 à 11:08
Azdruyel Messages postés 66 Date d'inscription vendredi 4 juin 2004 Statut Membre Dernière intervention 10 mai 2005 - 5 juil. 2004 à 21:19
Bonjour a tous! :)
Aujourd'hui,un nouveau jour, et donc un nouveau probleme!!!
Alors voila, mon truc c'est que j'affiche en fond dans un JPanel une image (cela ce fait au moment de la creation de ce dernier avec la methode paintComponents), mais lorsque je change d'image de fond, et ben j'arrive pas a raffraichir le JPanel pour que l'on puisse voir la nouvelle image.
Pour ceux qui ont le temps ou que ca interesse, bah je vous met le code du JPanel que j'ai deja fait, et si quelqu'un avait une idee de comment faire le refresh(), et ben ca me sauverai grandement!!!:)

import javax.swing.*;
import java.awt.Image;
import java.awt.*;
import java.io.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;

/**
*
* @author farid
*
* La classe ImagePanel permet de créer un Panel permettant d'aficher une image en fond
* Cette classe va nous permettre d'afficher l'image que l'on va charger
*/
public class ImagePanel extends JPanel
{
private BufferedImage image;
private int w; // largeur de l'image
private int h; // hauteur de l'image
private int x,y; // coordonnées du coin sup gauche de l'image

private int x1=0,y1=0; // coordonnées du coin sup gauche de la zone d'annotation
private int x2=0,y2=0; // largeur et hauteur de la zone d'annoation

private int taille=13; //taille de la police de la zone d'annotation

private JTextArea are;
private Color couleurChoisie;
private JColorChooser tcc;
private Choice choixm;
private Image mon_image;
private Toolkit toolkit;

/**
* Le constructeur :
* @param fileImg le fichier de l'image.
* @param x coordonnée x du coin supérieur gauche.
* @param y coordonnée y du coin supérieur gauche.
* @param width largeur de l'image.
* @param height hauteur de l'image.
*/
public ImagePanel(File fileImg,int x,int y,int width,int height)
{
super();

/** Accès au toolkit : **/
toolkit = Toolkit.getDefaultToolkit();

/**si le fichier est vide on charge l'image fichierVide**/
if(fileImg==null)
{
mon_image = toolkit.getImage(this.getClass().getResource("fichierVide.jpg"));
}
/**sinon on recupère l'adresse du fichier selectionné**/
else
{
mon_image=toolkit.getImage(fileImg.getAbsolutePath());
}

/**on convertit l'image en BufferedImage**/
image = toBufferedImage(mon_image);

this.x = x;
this.y = y;
w = width;
h = height;

/**Zone de Texte permettant d'effectuer les annotations**/
are=new JTextArea();
are.setForeground(Color.black);
are.setFont(new Font("Comic sans MS",Font.BOLD,taille));
are.setSelectionColor(Color.yellow);
are.setOpaque(false); //on rend la zone de texte invisible
are.setBorder(BorderFactory.createLineBorder(Color.black));
are.setLineWrap(true); //On souhaite un retour à ligne automatique
are.setWrapStyleWord(true); //On souhaite que les mots ne soient pas coupés

//add(are);
}

/**
* Gere l'affichage graphique du JPanel, ainsi que le refraichissement.
*/
public void paintComponent(Graphics g)
{
Graphics2D g2 =(Graphics2D) g;
super.paintComponent(g2);
g2.drawImage(image,x,y,w,h,null);
}

public void paint( Graphics g )
{
Graphics2D g2 =(Graphics2D) g;
super.paint( g2 );

/**Couleur du rectangle representant la zone d'annotation**/
g2.setColor(couleurChoisie);

/**Degré de transparence de la zone d'annotation (ici transparence = 30% --> 0.3f)**/
g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.3f )); //

/**Tracé du rectangle representant la zone d'annotation**/
g2.fillRect(
x1, // x
y1, // y
x2, // largeur
y2); // hauteur
}

/**
* Gere les evenements de glissement de sourie (bouton presse)
*/
public void mouseDragged(MouseEvent e)
{
x2=(int)(e.getPoint().getX())-x1;
y2=(int)(e.getPoint().getY())-y1;

are.setSize(x2,y2);
this.repaint();
}


/**
* Gerer les evenement lors du deplacement de la sourie
*/
public void mouseMoved(MouseEvent e)
{
}

/**
* Evenement appelle alors d'un clic de sourie
*/
public void mouseClicked(MouseEvent e)
{
}


/**
* Evenement appelle alors que la sourie sort de les frontieres d'un composant
*/

/**
* Gere les evements au moment ou le bouton de la souris est presse
*/
public void mousePressed(MouseEvent e)
{
x1 = (int)(e.getPoint().getX()-7);
y1 = (int)(e.getPoint().getY()-30);
are.setLocation(x1,y1);
}


/**
* Gere les evenements quand le bouton de souris est relache apres glissement
*/
public void mouseReleased(MouseEvent e)
{
}

/**
* Permet de récuperer la couleur du JColorChooser
*/
public Color getCouleur()
{
return couleurChoisie;
}

public BufferedImage toBufferedImage(Image image) {
/* On test si l'image n'est pas déja une instance de BufferedImage */
if( image instanceof BufferedImage ) {
/* cool, rien à faire */
return( (BufferedImage)image );
} else {
/* On s'assure que l'image est complètement chargée */
image = new ImageIcon(image).getImage();

/* On crée la nouvelle image */
BufferedImage bufferedImage = new BufferedImage( image.getWidth(null), image.getHeight(null), BufferedImage.TYPE_INT_RGB );
Graphics g = bufferedImage.createGraphics();
g.drawImage(image,0,0,null);
g.dispose();

return( bufferedImage );
}
}

/**
* @return Returns the image.
*/
public BufferedImage getImage() {
return image;
}
/**
* @param image The image to set.
*/
public void setImage(BufferedImage image) {
this.image = image;
}

/**
* @return Returns the mon_image.
*/
public Image getMon_image() {
return mon_image;
}
/**
* @param mon_image The mon_image to set.
*/
public void setMon_image(Image mon_image) {
this.mon_image = mon_image;
}

/**
* @return Returns the h.
*/
public int getH() {
return h;
}
/**
* @param h The h to set.
*/
public void setH(int h) {
this.h = h;
}
/**
* @return Returns the w.
*/
public int getW() {
return w;
}
/**
* @param w The w to set.
*/
public void setW(int w) {
this.w = w;
}
/**
* @return Returns the x.
*/
public int getX() {
return x;
}
/**
* @param x The x to set.
*/
public void setX(int x) {
this.x = x;
}
/**
* @return Returns the x1.
*/
public int getX1() {
return x1;
}
/**
* @param x1 The x1 to set.
*/
public void setX1(int x1) {
this.x1 = x1;
}
/**
* @return Returns the x2.
*/
public int getX2() {
return x2;
}
/**
* @param x2 The x2 to set.
*/
public void setX2(int x2) {
this.x2 = x2;
}
/**
* @return Returns the y.
*/
public int getY() {
return y;
}
/**
* @param y The y to set.
*/
public void setY(int y) {
this.y = y;
}
/**
* @return Returns the y1.
*/
public int getY1() {
return y1;
}
/**
* @param y1 The y1 to set.
*/
public void setY1(int y1) {
this.y1 = y1;
}
/**
* @return Returns the y2.
*/
public int getY2() {
return y2;
}
/**
* @param y2 The y2 to set.
*/
public void setY2(int y2) {
this.y2 = y2;
}
}

Voila et pis merci a tous :)

5 réponses

toffe12 Messages postés 53 Date d'inscription vendredi 12 septembre 2003 Statut Membre Dernière intervention 23 septembre 2005 1
5 juil. 2004 à 11:58
je suppose que tu veux rafraichier lorsque tu emploie setImage ou setMon_Image, iol faut rajouter dans ces fonction la methode repaint() qui redessinera ton jpanel
0
Azdruyel Messages postés 66 Date d'inscription vendredi 4 juin 2004 Statut Membre Dernière intervention 10 mai 2005
5 juil. 2004 à 12:30
Alors si ca pouvait raffraichir quand je fais setMon_Image, bah c clair que ca serait bien cool, et le prob c que je n'arrive pas a trouver la fonction pour redessiner mon panel, du coup je me retrouve tout bloque et c'est pour ca que je lance mon appel : "AU SECOUUUUUUUUUUUUUURS!!!"
Voila
0
Asrull Messages postés 79 Date d'inscription lundi 19 avril 2004 Statut Membre Dernière intervention 17 novembre 2004 1
5 juil. 2004 à 15:28
tite précision.
ton code est illisible je m'explique, je sait pas avec quel outil tu bosses en java (perso c ultraedit) mais le coup des commentaire inutiles qui saturent le source, ça m'irrite tellement le cerveau que je n'arrive pas à lire (ct mon coup de tête.
cela mis à part (mais je te dis tout ça à l'aveugle).
Je comprend pas trop ce que tu veux dire par redessiner ton panel. repaint redessine ton panel. Par contre un problème qui peut se poser c'est que le repaint soit lancé avant même que l'image suivante soit chargée en mémoire, Utilise tu un MediaTracker ? (j'ai vu qq part un bufferedImage mais suis pas sur que ce soit suffisant)

Oobaï TaPou !
0
Asrull Messages postés 79 Date d'inscription lundi 19 avril 2004 Statut Membre Dernière intervention 17 novembre 2004 1
5 juil. 2004 à 15:41
mais toffe12 a raison il te manque un repaint() dans setImage et setMon_Image. Ton Instruction pour mesurer le chargement de l'image new ImageIcon().getImage() brrr ... c moyen. le MediaTracker te donne beaucoup plus de contrôle.

Oobaï TaPou !
0

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

Posez votre question
Azdruyel Messages postés 66 Date d'inscription vendredi 4 juin 2004 Statut Membre Dernière intervention 10 mai 2005
5 juil. 2004 à 21:19
Bon dans un premier temps, merci a tous les 2 d'avoir tout de meme mater le code, j'ai eu honte quand je l'ai mis comme ca mais c'est que mon patron me mettait la pression avant que je l'envoie chier, du coup j'ai fait a la va vite!!!
Alors je reprend en plus cool vu que ma journee est fini.
Donc je bosse sous Eclipse et je remet le code sans les commentaire pour ton cerveau Asrull :-p , ca seront con de choper une meningite a cause d'une irritation aigue du cerveau!!! ;)

import javax.swing.*;
import java.awt.Image;
import java.awt.*;
import java.io.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;

public class ImagePanel extends JPanel
{
private BufferedImage image;
private int w;
private int h;
private int x,y;

private int x1=0,y1=0;
private int x2=0,y2=0;

private int taille=13;

private JTextArea are;
private Color couleurChoisie;
private JColorChooser tcc;
private Choice choixm;
private Image mon_image;
private Toolkit toolkit;

public ImagePanel(File fileImg,int x,int y,int width,int height)
{
super();

toolkit = Toolkit.getDefaultToolkit();

if(fileImg==null)
{
mon_image = toolkit.getImage(this.getClass().getResource("fichierVide.jpg"));
}
else
{
mon_image=toolkit.getImage(fileImg.getAbsolutePath());
}

image = toBufferedImage(mon_image);

this.x = x;
this.y = y;
w = width;
h = height;

are=new JTextArea();
are.setForeground(Color.black);
are.setFont(new Font("Comic sans MS",Font.BOLD,taille));
are.setSelectionColor(Color.yellow);
are.setOpaque(false);
are.setBorder(BorderFactory.createLineBorder(Color.black));
are.setLineWrap(true);
are.setWrapStyleWord(true);
}

public void paintComponent(Graphics g)
{
Graphics2D g2 =(Graphics2D) g;
super.paintComponent(g2);
g2.drawImage(image,x,y,w,h,null);
}

public void paint( Graphics g )
{
Graphics2D g2 =(Graphics2D) g;
super.paint( g2 );

g2.setColor(couleurChoisie);

g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.3f ));

g2.fillRect(x1, y1, x2, y2);
}

public BufferedImage toBufferedImage(Image image) {
if( image instanceof BufferedImage ) {
return( (BufferedImage)image );
} else {
image = new ImageIcon(image).getImage();

BufferedImage bufferedImage = new BufferedImage( image.getWidth(null), image.getHeight(null), BufferedImage.TYPE_INT_RGB );
Graphics g = bufferedImage.createGraphics();
g.drawImage(image,0,0,null);
g.dispose();

return( bufferedImage );
}
}

}

Pour le ImageIcon().getImage(), c'est du code que j'ai choper sur le site, sinon mon probleme est que je ne sais pas comment faire le repaint(), ni que les mediatracker existaient, mais je vais aller me documenter demain!!! :)
Enfin voila et toutes mes excuses pour la premiere version du code, et encore merci a vous 2 ;)
0
Rejoignez-nous