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 :

Transférer image entre Panels et Frame


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Ergonome
    Inscrit en
    Mai 2015
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ergonome

    Informations forums :
    Inscription : Mai 2015
    Messages : 34
    Par défaut Transférer image entre Panels et Frame
    Bonjour tout le monde.
    Je n'arrive pas à mettre l'image choisie en fond de la classe Home.
    J'ai essayé beaucoup de moyens différents mais je n'ai pas réussi. A chaque fois, j'ai un message d'erreur : java.lang.NullPointerException suivi de unknow source. J'ai essayé de mettre un getter pour récupérer l'image dans la classe Photo (peut-être pas nécessaire), et j'ai fait une méthode dans la classe Home qui changerait l'image de fonds. Mais je ne sais pas si c'est le bon moyen. Afin de simplifier, j'ai supprimé quelques lignes de code.
    Les détails ci-dessous.

    Voici la classe de mon écran principal.
    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
     
    public class Home extends JFrame {
     
    	private JPanel panelCentre = new JPanel();
    	private JButton buttonGalery= new JButton("galerie");
     
    	public Home(){
    		setSize(300,500);
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    		add(buttonGalery, BorderLayout.SOUTH);
    		add(panelCentre);
    		buttonGalery.addActionListener(new Galerie());
    	}
     
    	public void setFondEcran(JPanel jPanel) {
    	     panelCentre.removeAll(); 
    	     if ( jPanel!=null ) {
    	        panelCentre.add(jPanel);
    	     }
    	     panelCentre.revalidate(); 
    	     panelCentre.repaint();
    	}
     
    	class Galerie implements ActionListener{
    		public void actionPerformed(ActionEvent e) {
    			PhotoGalerie g = new PhotoGalerie();
    			g.setVisible(true);
    		}
    	}
     
    	public static void main(String[] args) {
    		Home h = new Home();
    		h.setVisible(true);
    	}
    }
    Voici les deux photos à choisir.
    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
     
    public class PhotoGalerie extends JDialog{
     
    	private JPanel panCenter = new JPanel();
    	public final ImageIcon[] images; 
     
    	public PhotoGalerie(){
    		setModal(true);
    		setSize(300,500);
     
    		images = new ImageIcon[]{
    				new ImageIcon("NomImage1.jpg"),
    				new ImageIcon("NomImage2.jpg"),};
     
    		final JPanel panCenter = new JPanel(new GridLayout(0,2));
    		for(ImageIcon image : images) {   
    			JButton button = new JButton( new ImageIcon( image.getImage().getScaledInstance(144,88,java.awt.Image.SCALE_SMOOTH)));
    			button.addActionListener( new PhotoAgrandir (image) ); 
    			panCenter.add(button);
    		}
    		add(panCenter, BorderLayout.CENTER); 
    	}
    }
    Et encore la classe qui implements actionlistener et qui enregistre l'image en paramètre.

    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
     
    class PhotoAgrandir implements ActionListener {
     
    	private final ImageIcon image; 
     
    	public PhotoAgrandir(ImageIcon image) {
    		this.image=image;
    	}
     
    	public void actionPerformed(ActionEvent e) {
    		Photo p = new Photo();
    		p.setPanelPhoto (image);
    		p.setVisible(true);
    	}
     
    	public ImageIcon getImage(){  // je ne sais pas si c'est vraiment nécessaire
    		return image;
    	}
    }
    Et voici la dernière JDialog. Je souhaite, en appuyant sur le boutton : buttonFondEcran, mettre l'image comme "fonds" de la Frame Home (1ère classe tout en haut).

    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
     
    public class Photo extends JDialog {
     
    	private JButton buttonFondEcran = new JButton("Fond ecran");
    	private JPanel panNorth = new JPanel();
    	private JPanel panCenter = new JPanel();
    	private Home h;
    	private PhotoAgrandir pa;
     
    	public Photo(){
    		setModal(true);
    		setSize(300,500);
     
    		panNorth.add(buttonFondEcran);
    		add(panNorth, BorderLayout.NORTH);
    		add(panCenter, BorderLayout.CENTER);
     
    		buttonFondEcran.addActionListener(new changerfondEcran());
    	}
     
    	public void setPanelPhoto(ImageIcon image) {
    	     panCenter.removeAll(); 
    	     if ( image!=null ) {
    	        panCenter.add( new JLabel(image) ); 
    	     }
    	     panCenter.revalidate(); 
    	     panCenter.repaint(); 
    	}
     
    	public JPanel getPanCenter(){
    		return panCenter;
    	}
     
    	class changerfondEcran implements ActionListener{
    		public void actionPerformed(ActionEvent arg0) {
    			h.setFondEcran(getPanCenter());	
    		}
    	}
     
    	class ButtonReturnClick implements ActionListener{
    		public void actionPerformed(ActionEvent arg0) {
    			dispose();
    		}
    	}
    }
    Quelqu'un pourrait-il me guider svp? merci

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    Tout d'abord, ton image n'est pas mise vraiment en fond de frame, mais au centre de la fenêtre (exactement au centre du content pane de la fenêtre). Si c'est ce que tu veux vraiment, tant mieux. Si tu veux vraiment la mettre en fond, ce sera un tout petit peu plus compliqué .

    Ensuite, pourquoi obtiens-tu une NullPoiterException dans :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    h.setFondEcran(getPanCenter());
    Réponse : parce que h est null. En effet, cette variable n'est initialisée nulle part. Il va falloir que tu lui donnes comme valeur la référence de ta fenêtre.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public class Photo {
     
            private Home h;
    	private PhotoAgrandir pa;
     
    	public Photo(Home home){
     
               h = home
     
              /* ... */
     
            }
     
    }
    Donc, il va falloir faire, dans PhotoAgrandir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public void actionPerformed(ActionEvent e) {
    		Photo p = new Photo(home);
    		p.setPanelPhoto (image);
    		p.setVisible(true);
    	}
    Donc avoir cette variable home initialisée avec la référence de la fenêtre, qu'on passera au constructeur de PhotoAgrandir, de la même manière qu'on le passe à Photo. Et ainsi de suite (donc pareil dans PhotoGalerie). Ce qui est compliqué dans ton interface, c'est que tu as des dialogues qui s'ouvrent en cascade : on peut procéder différemment lorsqu'on a qu'un seul dialogue, pour choisir une photo : c'est le composant qui ouvre le dialogue qui récupère la photo choisie dans le dialogue (comme on fait pour un JFileChooser), mais avec plusieurs dialogues, susceptibles d'avoir différentes fonctions, on ne peut pas : soit on passe une référence de ce qu'on veut pouvoir accéder (si tu as prévu de faire d'autres types d'interactions dans le genre, prévoir une classe intermédiaire (contexte), qui permettra d'ajouter de nouvelles variables, sans modifier tous les constructeurs et les classes), soit on fait un accès statique, avec Singleton (fonctionne si la fenêtre principale ne peut être dupliquée à aucun moment), soit on fait un système un peu complexe pour un débutant (à base de contexte, services, ActionFactory, etc...)


    Par ailleurs, ce n'est pas une bonne idée de transférer des JPanel de fenêtre en fenêtre : autant transférer l'image (ou ImageIcon à la limite) :

    Donc au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public void setFondEcran(JPanel jPanel) {
    	     panelCentre.removeAll(); 
    	     if ( jPanel!=null ) {
    	        panelCentre.add(jPanel);
    	     }
    	     panelCentre.revalidate(); 
    	     panelCentre.repaint();
    	}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public void setFondEcran(ImageIcon image) {
    	     panelCentre.removeAll(); 
    	     if ( image!=null ) {
    	        panelCentre.add(new JLabel(image));
    	     }
    	     panelCentre.revalidate(); 
    	     panelCentre.repaint();
    	}
    exactement comme dans Photo, sauf que dans Photo, il faudra mémoriser l'image dans une variable pour pouvoir la passer à la méthode setFondEcran().
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre averti
    Homme Profil pro
    Ergonome
    Inscrit en
    Mai 2015
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ergonome

    Informations forums :
    Inscription : Mai 2015
    Messages : 34
    Par défaut
    Salut, merci beaucoup pour les explications très instructives. J'en prends note pour la suite et j'irai regarder ces différents moyens.
    J'ai encore quelques soucis. Dans ma classe Photo, pour appeler l'ImageIcon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    h.setFondEcran(imageIcon);
    Comment dois-je faire pour faire correspondre imageIcon à une variable? J'ai essayé avec:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private ImageIcon imgaIcon;
    Mais ça ne marche pas.

    Mon deuxième problème est dans la classe PhotoAgrandir. J'ai mis comme tu me l'as dit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Photo p = new Photo(home);[
    mais comment puis-je donner une valeur à home? J'ai aussi essayé:

    private Home home; mais ça ne marche toujours pas.

    Merci

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par maxa88 Voir le message
    Salut, merci beaucoup pour les explications très instructives. J'en prends note pour la suite et j'irai regarder ces différents moyens.
    J'ai encore quelques soucis. Dans ma classe Photo, pour appeler l'ImageIcon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    h.setFondEcran(imageIcon);
    Comment dois-je faire pour faire correspondre imageIcon à une variable? J'ai essayé avec:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private ImageIcon imgaIcon;
    Mais ça ne marche pas.
    Là, tu crées une variable (dans Photo, normalement). Mais il faut lui donner une valeeur. Comme ça (dans Photo) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public void setPanelPhoto(ImageIcon image) {
                 this.imageIcon=image; // stocke l'image dans la variable de classe qui peut être utilisée
    	     panCenter.removeAll(); 
    	     if ( image!=null ) {
    	        panCenter.add( new JLabel(image) ); 
    	     }
    	     panCenter.revalidate(); 
    	     panCenter.repaint(); 
    	}
    Evidement, il faut que le nom soit le même : imageIcon et pas imgaIcon (mais c'est peut-être une faute de frappe seulement dans ton message)


    Citation Envoyé par maxa88 Voir le message
    Mon deuxième problème est dans la classe PhotoAgrandir. J'ai mis comme tu me l'as dit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Photo p = new Photo(home);[
    mais comment puis-je donner une valeur à home? J'ai aussi essayé:

    private Home home; mais ça ne marche toujours pas.

    Merci
    Bah, ça la même chose que pour l'image : ce que tu dois récupérer c'est la référence de la fenêtre principale (de classe Home), donc qui doit être passée de méthode en méthode dans tous les appels successifs (Relis ce que j'ai écrit). A commencer donc par dans Home elle-même :

    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
     
    public class Home extends JFrame {
     
    	private JPanel panelCentre = new JPanel();
    	private JButton buttonGalery= new JButton("galerie");
     
    	public Home(){
    		setSize(300,500);
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    		add(buttonGalery, BorderLayout.SOUTH);
    		add(panelCentre);
    		buttonGalery.addActionListener(new Galerie());
    	}
     
    	public void setFondEcran(JPanel jPanel) {
    	     panelCentre.removeAll(); 
    	     if ( jPanel!=null ) {
    	        panelCentre.add(jPanel);
    	     }
    	     panelCentre.revalidate(); 
    	     panelCentre.repaint();
    	}
     
    	class Galerie implements ActionListener{
    		public void actionPerformed(ActionEvent e) {
    			PhotoGalerie g = new PhotoGalerie(Home.this); // on transmet la référence de la fenêtre
    			g.setVisible(true);
    		}
    	}
     
    	public static void main(String[] args) {
    		Home h = new Home();
    		h.setVisible(true);
    	}
    }
    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
     
    public class PhotoGalerie extends JDialog{
     
    	private JPanel panCenter = new JPanel();
    	public final ImageIcon[] images; 
     
    	public PhotoGalerie(final Home home){ // on passe home au constructeur pour pouvoir le passer à PhotoAgrandir
    		setModal(true);
    		setSize(300,500);
     
    		images = new ImageIcon[]{
    				new ImageIcon("NomImage1.jpg"),
    				new ImageIcon("NomImage2.jpg"),};
     
    		final JPanel panCenter = new JPanel(new GridLayout(0,2));
    		for(ImageIcon image : images) {   
    			JButton button = new JButton( new ImageIcon( image.getImage().getScaledInstance(144,88,java.awt.Image.SCALE_SMOOTH)));
    			button.addActionListener( new PhotoAgrandir (image, home) ); // on passe home à PhotoAgrandir
    			panCenter.add(button);
    		}
    		add(panCenter, BorderLayout.CENTER); 
    	}
    }
    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
     
    class PhotoAgrandir implements ActionListener {
     
    	private final ImageIcon image; 
    
            private final Home home;
     
    	public PhotoAgrandir(ImageIcon image, final Home home) {
                    this.home = home;
    		this.image=image;
    	}
     
    	public void actionPerformed(ActionEvent e) {
    		Photo p = new Photo(home);
    		p.setPanelPhoto (image);
    		p.setVisible(true);
    	}
     
    	public ImageIcon getImage(){  // je ne sais pas si c'est vraiment nécessaire
    		return image;
    	}
    }
    etc.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre averti
    Homme Profil pro
    Ergonome
    Inscrit en
    Mai 2015
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ergonome

    Informations forums :
    Inscription : Mai 2015
    Messages : 34
    Par défaut
    Salut!
    merci beaucoup pour ton aide et tes conseils.
    J'ai mieux compris maintenant le chemin entre les différentes classes. Tout fonctionne parfaitement c'est super.
    Cordialement

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

Discussions similaires

  1. Différence entre Jpanel, JFrame, Frame, Panel
    Par Invité dans le forum Agents de placement/Fenêtres
    Réponses: 11
    Dernier message: 12/06/2006, 22h51
  2. Réponses: 8
    Dernier message: 09/03/2006, 22h06
  3. Pb lien entre fenetre de frame
    Par jeje_du_70 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 13/01/2006, 21h20
  4. [wxWidgets] image en fond de frame
    Par Kraz dans le forum wxWidgets
    Réponses: 1
    Dernier message: 14/08/2005, 13h41
  5. Disposition panel et frame
    Par vasilov dans le forum Agents de placement/Fenêtres
    Réponses: 8
    Dernier message: 08/07/2005, 11h50

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