Rafraichir une image [Résolu]

Signaler
Messages postés
22
Date d'inscription
lundi 1 novembre 2010
Statut
Membre
Dernière intervention
19 mars 2012
-
Messages postés
6414
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
29 juillet 2020
-
Bonjour,

J'essaie de faire une application et dans une de mes pages, je demande de choisir une image avec un JFileChooser, le probleme c'est qu'une fois qu'on a choisi une image on ne peut plus la modifier, enfin en apparence, quand j'affiche le chemin il a bien changer mais pas dans mon panel.

public void mouseClicked(MouseEvent arg0) {
JFileChooser fc=new JFileChooser();
fc.setFileSelectionMode(JFileChooser.FILES_ONLY);
fc.addChoosableFileFilter(new FileNameExtensionFilter("Image  jpg","jpg"));
int rep = fc.showOpenDialog(null);
if(rep==JFileChooser.APPROVE_OPTION){ //si on a appuyer sur OK
File file=fc.getSelectedFile(); // declaration du fichier selectionné
String chemin=file.getAbsolutePath(); //declaration variable contenant le chemin
String extension=chemin.substring(chemin.lastIndexOf('.')+1, chemin.length());
if(extension.equals("jpg")){
nomImage = chemin;
ImageIcon icon =  new ImageIcon( chemin);
System.out.println(chemin);
Image ima = scaleImage(icon.getImage(), paneImage.getWidth(), paneImage.getHeight());
ImageIcon imrez = new ImageIcon(ima);
JLabel image = new JLabel(imrez);
System.out.println(image);
paneImage.add(image);
repaint();
paneImage.setVisible(true);
}
}
}


Merci

12 réponses

Messages postés
6414
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
29 juillet 2020
345
Alors le problème vient de ton utilisation de la méthode add sur le JPanel qui contient l'image. Je ne sais pas quel conteneur il contient mais dans tous les cas, l'image n'est pas ajoutée comme il convient.

Je te conseil d'utiliser cette classe qui contient une méthode setImage(). De cette manière, tu ne recréé que très peu d'objets et ton image est modifiée facilement.


import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;

import javax.swing.JPanel;

public class PanelImage extends JPanel {

private static final long serialVersionUID = -6350324456764768311L;

private Image image;

public void setImage(Image image) {
this.image = image;
repaint();
}

public Image getImage() {
return image;
}

@Override
public void paintComponent(Graphics g){
if(image!=null){
Graphics2D g2d = (Graphics2D)g;
g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
g2d.drawImage(image, 0, 0, getWidth(), getHeight(), null);
}
}
}
Messages postés
6414
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
29 juillet 2020
345
Bonjour,

Une fois que tu as modifié ton image, il faut que tu fasses un repaint sur le panel : paneImage.repaint();
Messages postés
22
Date d'inscription
lundi 1 novembre 2010
Statut
Membre
Dernière intervention
19 mars 2012

Merci mais ça ne marche pas. Mon chemin change bien mais pas l'image.
Messages postés
6414
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
29 juillet 2020
345
Et l'extension est bien .jpg et non .JPG par exemple ?
Messages postés
22
Date d'inscription
lundi 1 novembre 2010
Statut
Membre
Dernière intervention
19 mars 2012

Non l'extension est la même ...
Messages postés
6414
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
29 juillet 2020
345
Tu peux regarder cette source, j'ai documenté et fait un code plus propre : http://www.javafr.com/codes/AFFICHER-IMAGE-ARRIERE-PLAN-DANS-JPANEL_54144.aspx
Messages postés
28
Date d'inscription
dimanche 27 mars 2005
Statut
Membre
Dernière intervention
13 mars 2012

Essais : paneImage.repaint();
Messages postés
6414
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
29 juillet 2020
345
C'est également la première chose que je lui ai proposé mais ca ne fonctionne pas.

Il ne fait pas ca de la manière la plus simple qui soit. Je dirais qu'il utilise un Layout et étant donné qu'il n'appelle pas validate, les modifications ne sont pas enregistrées et le repaint sur panelImage ne change rien.

Quand bien même il appellerait un validate, il ne supprime pas l'ancienne image donc, ca ne fonctionnerait pas non plus.
Messages postés
28
Date d'inscription
dimanche 27 mars 2005
Statut
Membre
Dernière intervention
13 mars 2012

Désolé pas capté que tu l'avais déjà proposé.

Par contre, JPanel héritant de JComponent, j'aurais utilisé paint plutôt que paintComponent.
A essayer ...
Messages postés
6414
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
29 juillet 2020
345
JComponent, c'est une classe de Swing, donc, on préfère paintComponent, mais paint fonctionne également étant donné que Swing est base sur awt.
Messages postés
22
Date d'inscription
lundi 1 novembre 2010
Statut
Membre
Dernière intervention
19 mars 2012

Merci ça fonctionne.
Messages postés
6414
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
29 juillet 2020
345
De rien.

a+