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 :

[JPanel] Image qui ne s'affiche pas


Sujet :

Java

Vue hybride

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

    Informations forums :
    Inscription : Novembre 2008
    Messages : 256
    Par défaut [JPanel] Image qui ne s'affiche pas
    Bonjour,
    Je souhaite créer un premier jpanel, qui contient deux autre jpanels : à gauche, une image, et à droite un texte (un décompte, peu importe).

    Voilà ce que j'ai fais :


    Ma fenêtre principale :
    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
     
    public Window() {
    		this.setTitle("My awesome window !!!");
    		this.setSize(400, 500);
    		this.setLocationRelativeTo(null);
    		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    		lCountdown = new JLabel("Ceci est un compte à rebour");
     
    		p = new Panneau("terning1.png");
     
     
    		container = new JPanel();
    		container.add(p, BorderLayout.WEST);
    		container.add(lCountdown);
     
    		this.setContentPane(container);
    		this.setVisible(true);
    	}
    Ma classe panneau (l'image) :
    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
     
    public class Panneau extends JPanel {
     
    	private String image;
    	private JPanel pan;
     
    	public Panneau(String image) {
    		super();
    		this.image = image;
    	}
     
    	@Override
    	protected void paintComponent(Graphics g) {
    		// TODO Auto-generated method stub
    		Image img;
    		try {
    			img = ImageIO.read(new File("images/"+image));
    			g.drawImage(img, 0, 0, this);
     
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}     
    	}	
    }
    Notez que la classe panneau fonctionne, puisque si dans ma Window je mets directement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.setContentPane(p);
    , l'image s'affiche bien.

    Pourriez-vous m'aider s'il vous plait?

    Merci

  2. #2
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 312
    Par défaut
    il y avait plusieurs petits soucis dans ton code :

    - tu utilisais BorderLayout.WEST pour container alors que tu n'avais pas défini le layout de container

    - java ne connait pas la taille preferentielle de Panneau tu dois lui definir avec setPreferredSize

    -il faut mettre le moins de choses possible dans paintComponent


    Voici le nouveau code pour Panneau :

    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
     
    import javax.swing.*;
    import java.awt.*;
    import java.io.*;
    import javax.imageio.*;
     
    public class Panneau extends JPanel {
     
    	private String image;
    	private Image img;
     
    	public Panneau(String image) {
    		super();
    		this.image = image;
    		img = new ImageIcon(image).getImage();
    		setPreferredSize(new Dimension(img.getWidth(null),img.getHeight(null)));
    	}
     
    	@Override
    	protected void paintComponent(Graphics g) {
    			g.drawImage(img, 0, 0, this);   
    	}	
    }
    et le code pour Window:

    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
     
    import javax.swing.*;
    import java.awt.*;
     
     
     
    public class Window extends JFrame {
    	JLabel lCountdown;
    	Panneau p;
    	JPanel container;
     
    	public Window() {
    		this.setTitle("My awesome window !!!");
    		this.setSize(400, 500);
    		this.setLocationRelativeTo(null);
    		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    		JLabel lCountdown = new JLabel("Ceci est un compte à rebour");
     
    		p = new Panneau("gifAnime.gif");
     
     
    		container = new JPanel();
    		container.setLayout(new BorderLayout());
    		container.add(p, BorderLayout.WEST);
    		container.add(lCountdown, BorderLayout.CENTER);
     
    		this.setContentPane(container);
    		this.setVisible(true);
    	}
     
    	public static void main(String[] args) {
    		Window rr = new Window();
    	}
    }

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 256
    Par défaut
    Ah super !
    Merci bien !

    J'ai juste eu besoin de remplacer la classe Panneau pour voir le changement !

    Le problème du layout ne faisait pas d'erreur, mais je veux bien croire que c'est mieux comme ça.

    Mais en fait, pourquoi utiliser ImageIcon plutôt que ImageIO.read ? Quelle est la différence ?

    Et juste un dernier petit coup de pouce :
    J'ai 6 images, nommées img1, img2, ... img6.
    Je reçois un signal par bluetooth : le numéro de l'image (1, 2, .... ou 6).

    Quand je reçois le numéro, je souhaite changer l'image. j'ai donc une fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public void setImage(int i) {
    		this.setContentPane(new Panneau("terning" + i + ".png"));
    		//p = new Panneau("terning" + i + ".png");
    		//p.repaint();
    		//container.revalidate();
     
    		//this.revalidate();
    		//mainContainer.revalidate();
    		//this.revalidate();
    	}
    J'ai laissé volontairement tous mes tests.
    Tu l'as bien compris, je reçois bien le numéro de l'image, mais après je n'arrive pas a remplacer l'image par une autre.
    Sur le web j'ai trouvé qu'il faut utiliser un repaint() ou un revalidate(), mais je n'arrive pas à faire fonctionner quoi que ce soit.

    Je précise que la function setImage est dans la même classe que Window.

    Saurais-tu m'aider ?
    Merci

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 256
    Par défaut
    Ok, voilà un truc qui marche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public void setImage(int i) {
    		p = new Panneau("terning" + i + ".png");
    		container.add(p, BorderLayout.WEST);
    		container.revalidate();
    	}
    Mais peut-être que j'ajoute image sur image là... ?
    Est ce que c'est la bonne manière de faire ?

  5. #5
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 312
    Par défaut
    Bonjour,

    Pour ImageIcon, c'est juste pour éviter de gérer les exceptions (try catch)

    et pour le reste, il y a plusieurs solutions:

    1 - remettre un nouveau panneau comme tu proposes mais il faut d'abord enlever l'ancien

    2 - ne garder qu'un seul panneau mais changer l'image dedans et donc la taille du Panneau si besoin

    3 - utiliser un cardLayout (je te laisse regarder sur javaDoc

    Ta dernière proposition peut être améliorée en enlevant le précédent

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public void setImage(int i) {
    		p = new Panneau("terning" + i + ".png");
                    container.removeAll();
    		container.add(p, BorderLayout.WEST);
    		container.revalidate();
    	}

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 256
    Par défaut
    Ok, merci pour toutes ces informations.

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 256
    Par défaut
    Petite rectification tout de même :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public void setImage(int i) {
                    p.removeAll();
    		p = new Panneau("terning" + i + ".png");
    		container.add(p, BorderLayout.WEST);
    		container.revalidate();
    	}
    Sinon, mon décompte ne s'actualise plus et reste bloqué...

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

Discussions similaires

  1. [WebForms]Image qui ne s'affiche pas
    Par Filippo dans le forum Général Dotnet
    Réponses: 3
    Dernier message: 19/12/2007, 20h51
  2. images qui ne s'affichent pas
    Par mikees dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 24/08/2006, 23h31
  3. background image qui ne s'affiche pas :(
    Par vermo dans le forum Balisage (X)HTML et validation W3C
    Réponses: 9
    Dernier message: 26/08/2005, 10h01
  4. [HTML]Image qui ne s'affiche pas sous firefox...
    Par OrangeBud dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 13/10/2004, 13h42
  5. [debutant][Tomcat]Images qui ne s'affichent pas
    Par omega dans le forum Servlets/JSP
    Réponses: 6
    Dernier message: 07/04/2004, 09h44

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