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

AWT/Swing Java Discussion :

Affichage image fond fenetre


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    422
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 422
    Par défaut Affichage image fond fenetre
    hello a tous!

    J'essaye d'afficher une image en fond de fenetre, bien disposer à l'aide d'un gridlayout sur un JPanel et je n'y arrive pas (et j'aimerai dailleur y faire figurer des icone dessus, mais plutard)...

    Pourtant j'utilise le code qu'il y a ds la fac ...

    voici mon code :

    pr l'implementation de ce jcomponent:
    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
     
    import javax.swing.*; 
    import java.awt.*; 
    import java.awt.image.*; 
     
    public class JPanelImageBg extends JComponent
    {
    	private int mode;
    	private TexturePaint texture; 
    	private BufferedImage bufferedImage; 
     
    	public static final int CENTRE = 0;
    	public static final int TEXTURE = 1;
     
    	JPanelImageBg( 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; 
    	}
     
    }
    et pr son utilisation :

    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
     
    import javax.swing.*;
     
    public class JPanelImageBgTest extends JFrame
    {
     
     
    	JPanelImageBgTest(String titre, int mode )
    	{	
    		super(titre);
    		this.setContentPane(new JPanelImageBg("butterfly.jpg",mode));
    		this.getContentPane().add(new JButton("test"));
    		setSize(500,500);
    		this.setVisible(true);
    	}
     
     
     
    	public static void main( String[] argv )
    	{	new JPanelImageBgTest("Centre",JPanelImageBg.CENTRE);
    		new JPanelImageBgTest("Texture",JPanelImageBg.TEXTURE);
    	}
    voila lerreur :

    Exception in thread "main" java.lang.IllegalArgumentException: Width (-1) and height (-1) cannot be <= 0
    at java.awt.image.DirectColorModel.createCompatibleWritableRaster(Unknown Source)
    at java.awt.image.BufferedImage.<init>(Unknown Source)
    at agents.JPanelImageBg.toBufferedImage(JPanelImageBg.java:43)
    at agents.JPanelImageBg.<init>(JPanelImageBg.java:18)
    at agents.JPanelImageBgTest.<init>(JPanelImageBgTest.java:12)
    at agents.JPanelImageBgTest.main(JPanelImageBgTest.java:21)


    Merci de m'aider!!

  2. #2
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    englobe ton code contenu dans paintComponent par un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    protected void paintComponent(Graphics g) {
     
       if(this.isShowing()) {
          ...
       }
    }

  3. #3
    Membre expérimenté Avatar de g0up1l
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    341
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 341
    Par défaut
    qu'est-ce que c'est que ce mic-mac :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    private BufferedImage toBufferedImage(Image image)
    	{	image = new ImageIcon(image).getImage();


    Vu l'erreur que tu as :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Exception in thread "main" java.lang.IllegalArgumentException: Width (-1) and height (-1) cannot be <= 0
    at java.awt.image.DirectColorModel.createCompatibleWritableRaster(Unknown Source)
    at java.awt.image.BufferedImage.<init>(Unknown Source)
    on pourrait penser que l'image n'est pas au bon emplacement physique.

  4. #4
    Membre expérimenté
    Inscrit en
    Janvier 2006
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 257
    Par défaut
    En SWING pureTu peux faire un truc comme sa :

    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
     
    import java.awt.Graphics;
    import java.awt.Toolkit;
     
    import javax.swing.JFrame;
     
    public class Fenetre extends JFrame {
     
        private String image = "image.jpg";
     
        public Fenetre() {
            this.setSize(400,400);
            this.setLocationRelativeTo(null);
            this.setVisible(true);
            this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        }
     
        @Override
        public void paint(Graphics arg0) {
            arg0.drawImage(Toolkit.getDefaultToolkit().getImage(image),0,0,null);
        }
     
        /**
         * @param args
         */
        public static void main(String[] args) {
            new Fenetre();
        }
     
    }

    Sinon tu peux utiliser l'API swing X qui a un composant JXImagePanel qui te permet de creer un panel avec une image de fond tres facilement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    // Création de notre panel
    JXImagePanel imagePanel=new JXImagePanel();
    Image image;
     
    try {
     
        // récupération de l'image que l'on applique au panel
        image = ImageIO.read(getClass().getResource("image.jpg"));
        imagePanel.setImage(image);
    } catch (IOException ex) {
        ex.printStackTrace();
    }

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    422
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 422
    Par défaut
    Ok les gars merci pour toutes vos solutions, jen ai choisi une qui semble bien marcher...

    La voici :

    pr l'extension du jcomponent :

    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 JPanelImageBg extends JComponent
    {
    	private int mode;
    	private TexturePaint texture; 
    	private BufferedImage bufferedImage; 
     
    	public static final int CENTRE = 0;
    	public static final int TEXTURE = 1;
     
    	JPanelImageBg( 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; 
    	}
     
    }
    et pr l'utilisation :
    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
     
    import java.awt.GridLayout;
     
    import javax.swing.*;
     
     
    /*contient le frame du cercle + frame de la legende*/
     
     
    public class FramePrincipal extends JFrame{
     
     
     
     
    	FramePrincipal(String titre, int mode )
    	{	
    		super(titre);
    		this.setSize(500,500);
    		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		this.setContentPane(new JPanelImageBg("D:/users/GeOxygene/GeOxygene/src/fr/ign/cogit/appli/carto/lucil/agents/couleurs_lumineuses.jpg",mode));
    		this.setVisible(true); 
    	}
     
     
     
    	public static void main( String[] argv )
    	{	new FramePrincipal("Visualisation agent",JPanelImageBg.CENTRE);
    		//new JPanelImageBgTest("Texture",JPanelImageBg.TEXTURE);
    	}
     
    }
    Mnt jai 2 pb :

    1) jaimerai redimensionner l'image de facon proportionnelle a mon cadre
    2) j'aimerai ke cette image soit disposer ds un gridlayout qui contient 3 colonne et kelle soit ds la colonne de gauche...

    Merci pr vos aide!

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    422
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 422
    Par défaut
    Un ptit UP Please...

  7. #7
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Fais attention à bien lire les règles (les up et ce genre de choses...): http://www.developpez.net/forums/ann...php?f=114&a=19

    Sinon pour ton probléme

    1) Pour que l'image se redimensionne en fonction de ton JPanel en ignorant ou pas son ratio:


    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
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
     
     
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.RenderingHints;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.IOException;
     
    import javax.imageio.ImageIO;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
     
    /*
     * Créé le 17 avr. 07
     *
     * Pour changer le modèle de ce fichier généré, allez à :
     * Fenêtre&gt;Préférences&gt;Java&gt;Génération de code&gt;Code et commentaires
     */
     
    /**
     * @author secabane
     *
     * Pour changer le modèle de ce commentaire de type généré, allez à :
     * Fenêtre&gt;Préférences&gt;Java&gt;Génération de code&gt;Code et commentaires
     */
    public class ImgPane extends JPanel {
     
        //Garder le ratio de l'image
        public static final int IGNORE_RATIO = 1;
        //redimensionner l'image sans prendre en compte son ratio
        public static final int KEEP_RATIO = 0;
     
        private BufferedImage im;
        private int ratioBehaviour;
     
        public ImgPane(BufferedImage im, int ratioBehaviour) {
            super();
            this.im = im;
            this.ratioBehaviour = ratioBehaviour;
            this.setPreferredSize(new Dimension(im.getWidth(), im.getHeight()));                
        }
     
     
     
     
        /* (non-Javadoc)
         * @see javax.swing.JComponent#paintComponent(java.awt.Graphics)
         */
        protected void paintComponent(Graphics arg0) {
            // TODO Raccord de méthode auto-généré
            super.paintComponent(arg0);
            Graphics2D g2d = (Graphics2D) arg0;
            //Pour respecter le ratio de l'image
            if(isShowing()) {                        
                g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
                g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
     
                if(ratioBehaviour == KEEP_RATIO) {
     
                    //On garde le ratio
     
                    //ratio largeur panel / largeur image            
                    double widthRatio = ((double)this.getWidth())/ im.getWidth();
                    //ratio largeur panel / largeur image
                    double heightRatio = ((double)this.getHeight())/ im.getHeight(); 
                    System.out.println("widthRatio = "+widthRatio+ " heightRatio = "+heightRatio);
                    //on prend le plus petit des deux afin que l'image tienne dans le panel
                    double tmpRatio = Math.min(widthRatio, heightRatio);
                    //largeur de sortie
                    int destWidth = (int) (im.getWidth()*tmpRatio);
                    //hauteur de sortie
                    int destHeight = (int)(im.getHeight()*tmpRatio);
                    //position sur les x
                    int verticalInset = 0;
                    //position sur les y
                    int horizontalInset = 0;
     
                    //calcul des marges
                    if(destWidth < this.getWidth()) {
                        horizontalInset = (this.getWidth() - destWidth) / 2; 
                    }
                    if(destHeight < this.getHeight()) {
                        verticalInset = (this.getHeight() - destHeight) / 2; 
                    }            
     
                    //dessin de l'image
                    g2d.drawImage(im, horizontalInset,verticalInset,destWidth,destHeight,null);
                } else if(ratioBehaviour == IGNORE_RATIO) {
                //    On ignore le ratio
                    g2d.drawImage(im, 0,0,this.getWidth(),this.getHeight(),null);
                }
            }
        }
     
     
        public static void main(String[] args) {
            JFrame f = new JFrame();
            try {
                BufferedImage im = ImageIO.read(new File("coverlow.jpg"));
                ImgPane pane = new ImgPane(im, ImgPane.KEEP_RATIO);
                f.add(pane);
                f.pack();
                f.setLocationRelativeTo(null);
                f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                f.setVisible(true);
            } catch (IOException e) {
                // TODO Bloc catch auto-généré
                e.printStackTrace();
            }
     
     
        }
     
    }
    2) Bah il suffit d'ajouter le JPanel contenant l'image à un JPanel possédant un GridLayout, je ne vois pas où est le problème
    ++

Discussions similaires

  1. Affichage image sur fond écran
    Par Marcopololo dans le forum Mise en page CSS
    Réponses: 4
    Dernier message: 28/02/2013, 12h38
  2. Probleme affichage images et fenetre
    Par flemzard dans le forum SDL
    Réponses: 1
    Dernier message: 06/07/2011, 11h11
  3. affichage image dans une fenetre
    Par neolink dans le forum C++
    Réponses: 1
    Dernier message: 10/06/2009, 14h05
  4. Affichage image en fond
    Par Bergonzoli dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 18/04/2008, 13h01
  5. [HTML & CSS] Affichage image de fond
    Par hedgehog dans le forum Mise en page CSS
    Réponses: 4
    Dernier message: 30/09/2006, 20h51

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