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

Agents de placement/Fenêtres Java Discussion :

Une image dans un Jpanel dans un Jpanel dans un Jframe


Sujet :

Agents de placement/Fenêtres Java

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 16
    Points : 8
    Points
    8
    Par défaut Une image dans un Jpanel dans un Jpanel dans un Jframe
    Bonjour

    J'ai le problème suivant.

    * situation 1
    Je fais afficher une image dans une classe DrawingZone héritant de Jpanel (à l'aide d'une surcharge de paintComponent).
    j'ajoute un DrawingZone d dans un Jframe avec setContentPane(d)
    Il y a aussi quelques boutons dans d.

    --> tout s'affiche bien, l'image et les boutons

    * situation 2
    En prévision de faire cohabiter dans le futur deux drawingZone je fais l'expérience suivante:
    J'ajoute le même DrawingZone dans un Jpanel, avant de mettre ce dernier dans le Jframe comme avant.

    --> les boutons s'affichent, mais plus l'image...

    Est ce que ce faisant j'ai fait une boulette quelque part flagrante ? Ou bien j'essaie d'extraire un code minimal de ça à vous mettre sous la dent... ?

    Merci d'avance à ce ceux qui me liront
    Thomas

  2. #2
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Et le code est ?

    Ah oui et as-tu verifier que ton panel avec image a une taille appropriee dans le second cas ? Paske bon quand tu le met en tant que content pane dans la frame, elle s'arrange pour le garder toujours a la bonne taille mais quand tu le met dans un autre panel il faut lui donner une taille ou alors cette derniere peut etre dependante du layout utilise, etc. Donc si ton composant n'a pas de taille (quand il n'y a pas de layout, il faut faire setBounds() par exemple) ou que le layout ne lui en fourni pas (tout le monde n'est pas BorderLayout.CENTER) et ben il peut ne pas apparaitre...

    Allez zou ! ComponentListener avec componentResized() sur l'image panel en question histoire de verifier ce qu'il en est !
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2007
    Messages : 171
    Points : 163
    Points
    163
    Par défaut
    Je ne sais pas si cela peut t'aider...

    J'ai fait un programme avec des JButton dans des classes extension de JPanel, puis j'ai inclus ces panneaux de boutons dans un JFrame. Pour que ces boutons fonctionnent et puissent communiquer avec les autres classes, j'ai dû les instancier dans le JFrame, les rappeler dans le constructeur avec this (this.Bouton = Bouton Pas moyen de faire communiquer les classes autrement. (Le JFrame demeurait nécessaire pour gérer le positionnement de ces boutons, 104 petits à mettre dans un coin de l'écran...)

    C'est peut-être pas ça ton problème?

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 16
    Points : 8
    Points
    8
    Par défaut
    Merci pour ta réponse. J'ai mis un ComponentListener (en allant voir un tuto, car je ne connaissais pas), et il se passe effectivemment des choses (resized, moved etc), mais bon, j'avoue que je ne comprend pas tout ce qui passe. Alors voici un code mini.

    Ma classe de lancement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    import javax.swing.*;
     
    public class Lancement {
    	public static void main(String[] args) {
     
    		SwingUtilities.invokeLater(new Runnable(){
    			public void run(){
    				SimpleWindow fenetre = new SimpleWindow();
    				fenetre.setVisible(true);
    			}
    		});
    	}
    }
    Ma fenetre 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
    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
     
    import javax.swing.*;
    import java.awt.Color;
    import java.awt.FlowLayout;
    import java.awt.event.ComponentEvent;
    import java.awt.event.ComponentListener;
     
    public class SimpleWindow extends JFrame implements ComponentListener{
     
    	public SimpleWindow(){
    		super();
    		build();
    	}
    	private void build(){
    		setTitle("My first IAI");
    		setSize(1200,870);
    		setLocationRelativeTo(null);
    		setResizable(false); 
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    		setContentPane(buildContentPane());
    	}
     
    	private JPanel buildContentPane(){
     
    		// le panel qui contiendra plus tard deux DrawingZone
    		JPanel container = new JPanel();		
    		container.setLayout(new FlowLayout());
    		container.setBackground(Color.black);
     
    		container.addComponentListener(this);
     
    		// dessin de la zone
    		DrawingZone dz = new DrawingZone();
    		dz.setLayout(new FlowLayout());
    		dz.setBackground(Color.black);
     
    		dz.addComponentListener(this);
     
    		// Mise en place des éléments de choix
    		JLabel l1 = new JLabel("Titre");
    		l1.setForeground(Color.white);
    		dz.add(l1);				
     
    		container.add(dz);
    		return container;     // si on retourne dz au lieu de container, l'image s'affiche !...
    	}
     
        public void componentHidden(ComponentEvent e) {
    		System.out.println(e.getComponent().getClass().getName() + " --- Hidden");
        }
     
        public void componentMoved(ComponentEvent e) {
        	System.out.println(e.getComponent().getClass().getName() + " --- Moved");
        }
     
        public void componentResized(ComponentEvent e) {
        	System.out.println(e.getComponent().getClass().getName() + " --- Resized ");            
        }
     
        public void componentShown(ComponentEvent e) {
            System.out.println(e.getComponent().getClass().getName() + " --- Shown");
     
        }	
    }
    Et la classe DrawingZone:
    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
     
    import java.awt.Graphics;
    import java.awt.Image;
    import java.awt.image.BufferedImage;
    import javax.swing.*;
     
    public class DrawingZone extends JPanel{
            private Image img;
     
    	public DrawingZone(){
    		super();
    		img = (new ImageIcon("01.jpg")).getImage();
    	}
     
    	public void paintComponent(Graphics g) {
    		super.paintComponent(g);
     
    		double r= (double)img.getWidth(this) / img.getHeight(this);
    		g.drawImage(img, 5, 35,(int)(800*r),800,null);        
    	}
    }

    Je débute avec swing, donc il y a surement plein de trucs pas très chouettes là dedans. Si vous avez la patience de me les indiquer indépendamment du problème posé dans ce poste, n'hésitez pas :-)

    Merci beaucoup

  5. #5
    Membre confirmé Avatar de ngpub
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    449
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 449
    Points : 505
    Points
    505
    Par défaut
    Ce que je vois c'est que le l'image commence à s'afficher à x=5 et y=35 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g.drawImage(img, 5, 35, (int)(800*r), 800, null);
    or le composant doit faire moins de 35 pixels de haut en fait il a la hauteur du JLabel qui lui est ajouté.

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 16
    Points : 8
    Points
    8
    Par défaut
    Ah ! Effectivemment, si je dessiner l'image à (0,0), je commence à avoir une image minuscule sur le fond du JLabel qui écrit "Titre"... Donc j'imagine qu'il prend le coin du JLabel comme repère ?

    Mais même en spécifiant une taille au container ou à dz dans la méthode buildContentPane (avec setBounds), ça ne va pas mieux.

    Je crois qu'il y a truc que je comprend pas du tout avec les JPanel...

    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
     
    	private JPanel buildContentPane(){
     
    		// le panel qui contiendra plus tard deux DrawingZone
    		JPanel container = new JPanel();		
    		container.setLayout(new FlowLayout());
    		container.setBackground(Color.black);
    		container.setBounds(0,0,1200,870);
     
    		// dessin de la zone
    		DrawingZone dz = new DrawingZone();
    		dz.setLayout(new FlowLayout());
    		dz.setBackground(Color.black);
    		// ou là dz.setBounds(0,0,1200,870);
     
     
    		// Mise en place des éléments de choix
    		JLabel l1 = new JLabel("Titre");
    		l1.setForeground(Color.white);
    		dz.add(l1);				
     
    		container.add(dz);
    		return container; 
    	}

  7. #7
    Membre confirmé Avatar de ngpub
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    449
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 449
    Points : 505
    Points
    505
    Par défaut
    Donc j'imagine qu'il prend le coin du JLabel comme repère ?
    Non, le JLabel donne juste sa dimension au DrawingZone qui n'en a pas de définie de façon explicite. L'image se place sans tenir compte du JLabel.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    container.setBounds(0,0,1200,870);
    Ce n'est pas le container qui pose problème, c'est le DrawingZone, non ?

    J'irais plus vers :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Dimension dim = new Dimension(160, 100);
    dz.setPreferedSize(dim);
    dz.setMinimumSize(dim);

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 16
    Points : 8
    Points
    8
    Par défaut
    Effectivemment ça marche avec ton code... Merci ! Mais il y a quelque chose que je comprend pas.

    Quand je faisais setBounds(0,0,200,200) sur le DrawingZone (dans son constructeur par exemple), et que je vérifiais la dimension juste après (avec getBounds), la DrawingZone a bien la bonne taille.

    Mais si je mets une autre vérification dans le paintComponent de DrawingZone, juste avant de dessiner, la DrawingZone a une taille différente (width=10,height=10). Comme si le setBounds (ou setSize, avait perdu son effet) ou que le JPanel avait encore changé en cours de route.

    Quelle est la différence avec l'utilisation de setPreferedSize ?

  9. #9
    Membre confirmé Avatar de ngpub
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    449
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 449
    Points : 505
    Points
    505
    Par défaut
    Le principe est que le LayoutManager utilise setBounds pour donner ses dimensions finales au composants juste avant l'affichage, pour cela il utilise les getMin/Max/PreferedSize.

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 16
    Points : 8
    Points
    8
    Par défaut
    Ok merci !

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

Discussions similaires

  1. [XL-2003] Chercher une image sur le pc et l'afficher dans une USF
    Par bob651 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 18/07/2009, 23h42
  2. Réponses: 1
    Dernier message: 18/04/2009, 23h15
  3. Réponses: 4
    Dernier message: 24/10/2008, 19h51
  4. affichage d'une image sur un composant dérivé de JPanel
    Par milou31 dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 15/09/2007, 05h47
  5. Réponses: 5
    Dernier message: 08/05/2006, 00h39

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