Jimagepanel : un panel affichant des images redimensionnées avec le même aspect ou étirée

Soyez le premier à donner votre avis sur cette source.

Vue 11 837 fois - Téléchargée 1 220 fois

Description

Une fois de plus, n'ayant rien trouvé de similaire sur JavaFr, je me suis fait cette petite classe étendant d'un JPanel qui permet d'afficher une image.

Fonctionnalités :
  • Affichage de l'image à partir d'un fichier ou d'une image déjà crée
  • Possibilité de spécifier les coordonnées X et Y de l'image
  • Possibilité d'afficher l'image telle quelle (sans redimensionnement) ou avec autoSize (redimensionnement)
  • Possibilité d'afficher l'image en gardant son aspect d'origine ou non (keepAspect)

Source / Exemple :


import javax.imageio.*;
import javax.swing.*;
import java.awt.*;
import java.io.*;

public class JImagePanel extends JPanel {

	private static final long serialVersionUID = 2724980460740151616L;
	
	private Image _image;
	private int _x;
	private int _y;
	private boolean _autoSize; 
	private boolean _keepAspect;
	
	public JImagePanel(File file, int x, int y, boolean autoSize, boolean keepAspect) throws IOException {
		super();
		
		setImage(ImageIO.read(file));
		setX(x);
		setY(y);
		setAutoSize(autoSize);
		setKeepAspect(keepAspect);
	}
	
	public JImagePanel(File file, int x, int y, boolean autoSize) throws IOException {
		this(file, x, y, true, false);
	}
	
	public JImagePanel(File file, int x, int y) throws IOException {
		this(file, x, y, true);
	}

	public JImagePanel(File file) throws IOException {
		this(file, 0, 0, true);
	}
	
	public JImagePanel(Image image, int x, int y, boolean autoSize, boolean keepAspect) {
		super();
		
		setImage(image);
		setX(x);
		setY(y);
		setAutoSize(autoSize);
		setKeepAspect(keepAspect);
	}
	
	public JImagePanel(Image image, int x, int y, boolean autoSize) {
		this(image, x, y, true, false);
	}
	
	public JImagePanel(Image image, int x, int y) {
		this(image, x, y, true);
	}
	
	public JImagePanel(Image image) {
		this(image, 0, 0, true);
	}
	
	public JImagePanel() {
		super();
		setX(0);
		setY(0);
		setImage(null);
		setAutoSize(false);
	}
	
	public void setImage(Image image) {
		_image = image;
	}
	
	public void setX(int x) {
		_x = x;
	}
	
	public void setY(int y) {
		_y = y;
	}
	
	public void setAutoSize(boolean autoSize) {
		_autoSize = autoSize;
	}
	
	public void setKeepAspect(boolean keepAspect) {
		_keepAspect = keepAspect;
	}
	
	public void paintComponent(Graphics g) {
		super.paintComponent(g);
		
		if (_image != null) {
			if (!_autoSize) {
				g.drawImage(_image, _x, _y, _image.getWidth(null), _image.getHeight(null), null);
			}
			else {
				Graphics2D g2d = (Graphics2D) g;
				Double scaleWidth = new Double(getWidth()) / new Double(_image.getWidth(null));
				Double scaleHeight = new Double(getHeight()) / new Double(_image.getHeight(null));
				if (_keepAspect) {
					if (scaleWidth > scaleHeight) {
						scaleWidth = scaleHeight;
					}
					else {
						scaleHeight = scaleWidth;
					}
				}
				g2d.scale(scaleWidth, scaleHeight);
				g2d.drawImage(_image, _x, _y, null);
			}
		}
	}

}

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

cs_DARKSIDIOUS
Messages postés
15815
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
83 -
Vérifie que tu n'as pas une exception qui est déclenché : est-ce que le fichier est correct ? Est-ce que les espaces dans le nom du fichier ne posent pas problème ?

De toute façon, ta façon de faire n'est pas la bonne : ca ne marchera que tant que le fichier existera, et qu'il sera placé sur le bureau du user "Administrateur" => gros risque qu'un beau jour le fichier soit supprimé ou déplacé.

Privilégie une image contenue dans le jar de ton application : beaucoup plus sûr !
achora2006
Messages postés
27
Date d'inscription
samedi 20 juin 2009
Statut
Membre
Dernière intervention
26 juillet 2009
-
bonjour j'ai essayer d' utiliser ton code mais ça ne marche pas pour moi aucune image ne s'affiche
est ce que l'image doit être dans le même dossier que mon projet
voici le code ou j'ai fais l'appel à ta classe

------------------------------------------------------------
import java.awt.Image;
import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;

public class NewJFrame extends javax.swing.JFrame {

File file = new File("C:/Documents and Settings/Administrateur/Bureau/me.JPG");
Image image ;
JImagePanel i= new JImagePanel();

/** Creates new form NewJFrame */
public NewJFrame() {
initComponents();
try {
image = ImageIO.read(file);
} catch (IOException ex) {
Logger.getLogger(NewJFrame.class.getName()).log(Level.SEVERE, null, ex);
}

i.setImage(image);
i.setX(20);
i.setY(30);
this.add(i);
}
---------------------------------------------------------------------------

Merci
cs_DARKSIDIOUS
Messages postés
15815
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
83 -
C'est vrai que c'est un point dont j'ai pas réfléchi !

Pour ce qui est de l'affichage en mosaïque : je n'en voyais pas l'intérêt pour l'utilisation que j'en ai, mais ca doit pas être grand chose à faire (tout comme faire un zoom par exemple).

DarK Sidious
Horfee
Messages postés
192
Date d'inscription
mercredi 9 avril 2003
Statut
Membre
Dernière intervention
10 août 2009
-
Hey,
Me suis fait un petit composant pareil...mais sans la possibilité de déplacer l'origine de l'image. Par contre g donné la possibilité en plus de mettre l'image en mosaique...
Par contre, il y a juste un petit souci : JPanel est serializable, et si tu enregistre l'image telle qu'elle elle va prendre énormément de place... moi je l'ai rendu transient histoire de mais bon... toi dans ton cas je pense qu'il y a moyen de faire mieux en serialisant le fichier...(je ne sais pas ce que ca donne ca par contre)

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.