IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 Java Discussion :

Affichage image dans JPanel


Sujet :

Java

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Septembre 2009
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2009
    Messages : 65
    Points : 41
    Points
    41
    Par défaut Affichage image dans JPanel
    Bonjour à tous.
    Je fais appel à vous car j'essaie désespérément d'afficher une image dans un JPanel, en vain.
    Je dispose d'une fenêtre (JSplitPane) divisée en deux parties, une gauche et une droite, chacune étant un JPanel. Dans mon JPanel de gauche (lui-même divisé en 3 JPanel via un BorderLayout), je souhaiterais afficher en bas (donc dans le JPanel placé en BorderLayout.SOUTH) mon image. Malheureusement, rien ne s'affiche. Les images (que je sélectionne via un JFileChooser) sont placées dans un dossier nommé "images" qui est dans le dossier de mon projet (c'es-à-dire à côté des dossiers src et bin). Le JFileChooser fonctionne correctement et me retourne bien le nom du fichier, auquel j'ajoute moi-même le préfixe "images/".
    Voici le code (uniquement ce qu'il faut pour comprendre).
    La classe JPanelImage :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
     
    import javax.swing.*; 
    import java.awt.*; 
    import java.awt.image.*; 
     
    public class JPanelImage extends JComponent
    {
    	private static final long serialVersionUID = 1L;
     
    	private int mode;
    	private TexturePaint texture; 
    	private BufferedImage bufferedImage; 
     
    	public static final int CENTRE = 0;
    	public static final int TEXTURE = 1;
     
    	JPanelImage(String fileName, int mode)
    	{	this.mode = mode;
    		this.bufferedImage = this.toBufferedImage(Toolkit.getDefaultToolkit().getImage(fileName));
    		this.texture = new TexturePaint(bufferedImage,new Rectangle(0, 0, bufferedImage.getWidth(), bufferedImage.getHeight())); 
    	} 
     
    	public void paintComponent(Graphics g)
    	{	switch(mode)
    		{	case TEXTURE :
    				Graphics2D g2d = (Graphics2D)g; 
    				g2d.setPaint(texture);
    				g2d.fillRect(0, 0, getWidth(), getHeight() );
    				break;
    			case CENTRE :
    				g.setColor(this.getBackground());
    				g.fillRect(0,0,getWidth(), getHeight() );
    				g.drawImage(bufferedImage,(getWidth()-bufferedImage.getWidth())/2,(getHeight()-bufferedImage.getHeight())/2,null);
    				break;
    			default :
    				super.paintComponents(g);
    		}
    	}
     
    	private BufferedImage toBufferedImage(Image image)
    	{	
    		image = new ImageIcon(image).getImage(); 
     
    		BufferedImage bufferedImage = new BufferedImage(image.getWidth(null), image.getHeight(null), BufferedImage.TYPE_INT_RGB); 
    		Graphics g = bufferedImage.createGraphics(); 
     
    		g.setColor(Color.white); 
    		g.fillRect(0, 0, image.getWidth(null), 
    		image.getHeight(null)); 
    		g.drawImage(image, 0, 0, null); 
    		g.dispose(); 
    		return bufferedImage; 
    	}
    }
    Le code du bouton sur lequel j'appuie pour sélectionner l'image via le JFileChooser :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    this.choixImage.addActionListener(new ActionListener() 
            {
    			public void actionPerformed(ActionEvent arg0) 
    			{
    				JFileChooser chooser = new JFileChooser("images");
    			    FiltreImages filtre = new FiltreImages();
    			    chooser.addChoosableFileFilter(filtre);
    			    chooser.setAcceptAllFileFilterUsed(false);
    			    chooser.setFileFilter(filtre);
    			    int returnVal = chooser.showOpenDialog(pan1);
    			    if(returnVal == JFileChooser.APPROVE_OPTION) 
    			    {
    			    	lienImg.setText(chooser.getSelectedFile().getName());
                                    // dessous = JPanel placé en SOUTH
    			    	dessous.add(new JPanelImage("images/"+lienImg.getText(), JPanelImage.CENTRE));			    	
    			    }
    			}
    		});
    Merci d'avance. =)

  2. #2
    Membre chevronné
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Points : 1 984
    Points
    1 984
    Par défaut
    Est ce que tu as fait un validate/revalidate apres chargement de l'image ?

    Tu peux aussi essayer un visible = false puis visible = true sur le JPanel qui a changé.

  3. #3
    Membre averti

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2010
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2010
    Messages : 246
    Points : 402
    Points
    402
    Par défaut
    Je vais te donner la méthode que j'utilise et que je trouve super pratique :

    Premièrement, je créer une classe "BackgroundComponent" qui extends JComponent , et qui ira chercher les images que je veux dans un package "ressources" de mon projet.

    Cette classe contient les méthodes qu'il faut pour que ton image soit redessiné, et redimensionné en fonction de la taille des panel/frame.

    Voici cette classe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
     
    /**
     * @author BETTEMBOURG Mickael
     * @file CVManager -> view -> BackgroungComponent.java
     * @date 27 avr. 2011 , 14:53:37
     *
     */
    package view;
     
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.Image;
    import java.awt.RenderingHints;
    import java.awt.image.BufferedImage;
     
    import javax.swing.ImageIcon;
    import javax.swing.JComponent;
     
    /**
     * Create the background image
     */
    public class BackgroungComponent extends JComponent {
     
    	private static final long serialVersionUID = 1L;
    	private Image imgBack;
     
    	/**
             * Construct background image
             */
    	public BackgroungComponent() {
     
    		imgBack = (new ImageIcon(this.getClass().getResource(
    				"/resources/fondClair.png"))).getImage();
    	}
     
    	/*
    	 * (non-Javadoc)
    	 * 
    	 * @see javax.swing.JComponent#paintComponent(java.awt.Graphics)
    	 */
    	public void paintComponent(Graphics g) {
    		g.setColor(this.getBackground());
    		g.fillRect(0, 0, getWidth(), getHeight());
    		g.drawImage(scale(imgBack, getWidth(), getHeight()), 0, 0, null);
     
    	}
     
    	/**
             * Resize an image
             * 
             * @param source
             *            the old image
             * @param width
             *            the width of the new image
             * @param height
             *            the height of the new image
             * @return the new image
             */
    	public static BufferedImage scale(Image source, int width, int height) {
    		BufferedImage buf = new BufferedImage(width, height,
    				BufferedImage.TYPE_INT_ARGB);
     
    		Graphics2D g = buf.createGraphics();
    		g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
    				RenderingHints.VALUE_INTERPOLATION_BILINEAR);
    		g.drawImage(source, 0, 0, width, height, null);
    		g.dispose();
     
    		return buf;
    	}
    }
    Une fois cela fait, c'est très facile. Dans chaque classe ou tu voudras afficher l'image de fond, tu n'as qu'a faire ceci dans le constructeur de ta frame/panel...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    setContentPane(new BackgroungComponent());
    libre à toi ensuite de modifier l'image, de passer un paramètre au constructeur afin de choisir l'image a afficher, ou tout autre chose...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Probleme Qualité d'affichage d'image dans JPanel
    Par snay13 dans le forum Débuter
    Réponses: 14
    Dernier message: 07/09/2010, 20h20
  2. Affichage image dans jpanel
    Par dark0502 dans le forum Interfaces Graphiques en Java
    Réponses: 1
    Dernier message: 02/11/2009, 16h10
  3. Affichage image dans un JPanel
    Par Revan dans le forum 2D
    Réponses: 2
    Dernier message: 02/01/2008, 21h52
  4. Problème affichage image dans IE6
    Par flogreg dans le forum IE
    Réponses: 6
    Dernier message: 13/02/2006, 14h29
  5. [VB6]Affichage images dans un datareport
    Par papadethiediouf dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 25/01/2006, 19h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo