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 :

Jframe avec image de fond (classe de la FAQ): les composants ne s'affichent pas


Sujet :

Java

  1. #1
    Membre confirmé Avatar de ben.IT
    Homme Profil pro
    Inscrit en
    Janvier 2009
    Messages
    431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 431
    Points : 486
    Points
    486
    Par défaut Jframe avec image de fond (classe de la FAQ): les composants ne s'affichent pas
    J'essaye de mettre une image de fond en utilisant la classe proposée dans la FAQ mais je rencontre une problème : je n'arrive pas à ajouter des composants qui soient visibles : l'image de fond recouvre tous les composants, comment faire :
    voici la classe de la faq :
    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
    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; 
     
    	}
     
     
     
    }
    Le bouton crée dans la classe de test ne s affiche pas :
    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
    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);
    	}
     
     
     
     
    }
    Comment faire ?
    merci d'avance

  2. #2
    Membre habitué
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2002
    Messages
    329
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2002
    Messages : 329
    Points : 139
    Points
    139
    Par défaut
    Bonjour,

    En effet, j'ai eu la même mésaventure que vous !

    Voici un lien qui vous aidera certainement : ici

    Bonne soirée !

  3. #3
    Membre confirmé Avatar de ben.IT
    Homme Profil pro
    Inscrit en
    Janvier 2009
    Messages
    431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 431
    Points : 486
    Points
    486
    Par défaut
    merci pour la réponse,
    c'est la solution que j'ai utilisée. il est donc nécessaire d'ajouter l'image à un jpannel, on ne pas pas l'utiliser directement dans la JFrame ?

  4. #4
    Expert confirmé
    Avatar de slim_java
    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2008
    Messages
    2 272
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2008
    Messages : 2 272
    Points : 4 539
    Points
    4 539
    Par défaut
    Citation Envoyé par benilto Voir le message
    on ne pas pas l'utiliser directement dans la JFrame ?
    on peut le faire mais il est recommandé de travailler sur un JPanel ou un JComponent

  5. #5
    Membre confirmé Avatar de ben.IT
    Homme Profil pro
    Inscrit en
    Janvier 2009
    Messages
    431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 431
    Points : 486
    Points
    486
    Par défaut
    juste par curiosité : comment faire ?
    dans la classe de la FAQ, les composants de la frame ne sont pas visibles ...
    merci
    ben

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

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Le problème dans la classe de la FAQ vient du fait qu'un JComponent j'a pas de Layout par défaut.

    Ajoute juste un simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.setLayout(new FlowLayout());
    dans le code du constructeur et tu verras le résultat.

    Accessoirement cette classe contient un autre petit problème au niveau du paintComponent. En effet dans le cas default il faut appeler
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    super.paintComponent(g);
    et non
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    super.paintComponents(g);
    Enfin pour être vraiment plus propre et utilisable il serait préférable que cette classe prenne en paramètre une URL plutôt qu'une chaine.
    Ca limite le nombre d'erreur à la con, et rend la classe plus classpath-friendly.

    Il suffit de changer le constructeur de la façon suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        JPanelImageBg( URL fileName, int mode ) throws IOException
     
        {
            super();
     
            this.setLayout(new FlowLayout());
            this.mode = mode;
            this.bufferedImage = ImageIO.read(fileName);
            this.texture = new TexturePaint(bufferedImage,new Rectangle(0, 0, bufferedImage.getWidth(), bufferedImage.getHeight()));
     
        }
    .

    De fait celà permet de passer des URL correspondant au classpath (obtenues via getClass().getRessource("/org/truc/machin/monimage.png"); si monimage.png se trouve dans le package org.truc.machin de l'application).

    ++

  7. #7
    Membre confirmé Avatar de ben.IT
    Homme Profil pro
    Inscrit en
    Janvier 2009
    Messages
    431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 431
    Points : 486
    Points
    486
    Par défaut
    voila qui marche

    merci
    a+
    ben

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

Discussions similaires

  1. Problème d'espace sur IE menu vertical avec image de fond
    Par dom dom from the dom dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 09/03/2007, 11h30
  2. Tableau d'entiers avec images en fond
    Par loic72 dans le forum AWT/Swing
    Réponses: 5
    Dernier message: 24/09/2006, 19h29
  3. [WinForms]Lenteur d'affichage formulaire avec image de fond
    Par olixelle dans le forum Général Dotnet
    Réponses: 2
    Dernier message: 06/09/2006, 14h06
  4. [VB.NET]TreeView avec image de fond ou couleur transparent
    Par m-mas dans le forum Windows Forms
    Réponses: 3
    Dernier message: 23/05/2006, 14h53
  5. boîte de dialogue avec image de fond + texte
    Par Eugénie dans le forum MFC
    Réponses: 13
    Dernier message: 31/08/2004, 13h32

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