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 :

Afficher une image après sélection JFileChooser [Débutant(e)]


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
    employé
    Inscrit en
    Mars 2015
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : employé

    Informations forums :
    Inscription : Mars 2015
    Messages : 31
    Par défaut Afficher une image après sélection JFileChooser
    Bonjour à tous,

    J'ai un problème d'affichage de fichier image dans un JPanel et de redimensionnement du JPanel . Effectivement je n'arrive pas à trouver l'erreur que je commets ou il me manque du code pour afficher une image dans le JPanel(pan). Je joints le
    code afin de vous puissiez m'expliquer ce qui cloche dans ce programme.
    Je vous remercie d'avance pour toutes les réponses et explications qui m'aiderons à évoluer.
    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
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
     
     
    package logiciel_fenetre;
     
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.IOException;
     
    import javax.imageio.ImageIO;
    import javax.swing.Box;
    import javax.swing.ImageIcon;
    import javax.swing.JButton;
    import javax.swing.JFileChooser;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JMenu;
    import javax.swing.JMenuBar;
    import javax.swing.JMenuItem;
    import javax.swing.JPanel;
     
    @SuppressWarnings("serial")
    public class Frame extends JFrame implements ActionListener {
     
     
     
    	private JPanel pan = new JPanel();
    	private JPanel jpl = new JPanel();
    	private JPanel cont = new JPanel();
     
     
    	private JButton btn1 = new JButton("Ouvrir");
    	private JButton btn2 = new JButton("Copier");
     
    	private Box panneauBouton = Box.createVerticalBox();
     
    	private JMenuBar menuBar = new JMenuBar();
     
    	private JMenu ficher = new JMenu("Ficher"),
    			aPropos = new JMenu("À propos");
     
    	private JMenuItem quitter = new JMenuItem("Quitter"),
    			aProposItem = new JMenuItem("Lisez-moi");  
     
     
    	public Frame(){
    		//Création de la fenêtre.
    		this.setTitle("Logiciel");
    		this.setSize(800, 500);
    		this.setResizable(false);
    		this.setLocationRelativeTo(null);
    		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		//On rend la fenêtre visible.
    		this.setVisible(true);
     
    		cont.setLayout(new BorderLayout());
     
    		panneauBouton.setPreferredSize(new Dimension(360, 400));
     
    		btn1.setMaximumSize(new Dimension(200, 30));
    		btn1.setAlignmentX(JButton.CENTER_ALIGNMENT);
     
    		btn2.setMaximumSize(new Dimension(200, 30));
    		btn2.setAlignmentX(JButton.CENTER_ALIGNMENT);
     
    		jpl.setBounds(20, 20, 360, 400);
    		jpl.setBackground(Color.BLUE);
     
    		pan.setBackground(Color.GREEN);
    		pan.setBounds(380, 20, 360, 380);
     
    		cont.add(jpl);
    		cont.add(pan);
     
    		this.setContentPane(cont);
     
    		this.initMenu();
     
    	}
     
    	private void initMenu(){
    		//Menu ficher
    		ficher.add(quitter);
    		//Pour quitter l'application
    		quitter.addActionListener(new ActionListener(){
    			public void actionPerformed(ActionEvent event){
    				System.exit(0);
    			}
    		});
     
    		ficher.add(quitter);
     
    		//Menu À propos
    		aPropos.add(aProposItem);
     
    		//Ajout des menus dans la barre de menus
    		menuBar.add(ficher);
    		menuBar.add(aPropos);
     
    		//Ajout de la barre de menus sur la fenêtre
    		this.setJMenuBar(menuBar);
     
    		panneauBouton.add(Box.createVerticalStrut(150));
    		panneauBouton.add(btn1);
    		panneauBouton.add(Box.createVerticalStrut(50));
    		panneauBouton.add(btn2);
     
    		jpl.add(panneauBouton, BorderLayout.WEST);
     
    		btn1.addActionListener(new ActionListener(){
    			public void actionPerformed(ActionEvent e) {
    				if(e.getSource()== btn1){
    					//Création d'un objet de type String.
    					@SuppressWarnings("unused")
    					String fichierImage;
    					//Création d'un composant JFileChooser.
    					JFileChooser dialogue = new JFileChooser();
    					//Ouvrir une boîte de dialogue qui permet
    					//la recherche d'un fichier.
    					int result = dialogue.showOpenDialog(Frame.this);
    					//Si un fichier a été sélectionné.
    					if(result == JFileChooser.APPROVE_OPTION) {
    						fichierImage = dialogue.getSelectedFile().getAbsolutePath();
    					}
    				}
     
    				@SuppressWarnings("unused")
    				class panneau extends JPanel {
     
    					private BufferedImage image;
     
    					public void paintComponent(Graphics g, String fichierImage){
    						super.paintComponent(g);
     
    						try {
    							BufferedImage image = ImageIO.read(new File(fichierImage));
    							ImageIcon icon = new ImageIcon(image);
    							JLabel lab = new JLabel(icon);
    							pan.setLayout(new BorderLayout());
    							pan.add(lab, BorderLayout.CENTER);
     
    							g.drawImage(image, 200, 200, this );
     
    							this.setVisible(true);
     
    						} catch (IOException e) {
    							e.printStackTrace();
    						}
     
    						pan.setVisible(true);
    						repaint();
     
    					}
    				}
    			}
    		});
    	}
     
    	@Override
    	public void actionPerformed(ActionEvent arg0) {
    		// TODO Stub de la méthode généré automatiquement
     
    	}
    }

  2. #2
    Membre chevronné

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2014
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Burkina Faso

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Août 2014
    Messages : 262
    Par défaut
    Bonsoir zatopec,
    comment tu vas ? Il faut juste revoir ton calmement.
    Ceci :
    cont.add(jpl);
    cont.add(pan);
    N'est pas ce que tu souhaite avoir, puisque le layout associé à cont est un BorderLayout. Donc il faut préciser où tu souhaite ajouter ces panneaux sinon jpl sera écrasé par pan.Ceci n'est pas le problème, le problème c'est que la classe panneau que tu as personnalisé pour pouvoir afficher l'image n'a jamais été instanciée !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    private JPanel pan = new JPanel();
    	private JPanel jpl = new JPanel();
    	private JPanel cont = new JPanel();
    C'est bien çà ? Si c'est pan qui est supposé afficher l'image mieux vaut faire de l'objet pan une instance de la classe panneau.

    __salut !

  3. #3
    Membre averti
    Homme Profil pro
    employé
    Inscrit en
    Mars 2015
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : employé

    Informations forums :
    Inscription : Mars 2015
    Messages : 31
    Par défaut
    Bonjour Lankoande,

    Je vais bien et je te remercie de m'avoir répondu aussi vite. C'est bien dans pan que l'image doit s'afficher avec un JLabel mais l'image ne s'affiche toujours pas. Par contre les 2 JPanel sont bien visible, c'est pour ça que je les ai coloré. Je remets le code avec les modifications.

    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
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
     
     
    package logiciel_fenetre;
     
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.IOException;
     
    import javax.imageio.ImageIO;
    import javax.swing.Box;
    import javax.swing.ImageIcon;
    import javax.swing.JButton;
    import javax.swing.JFileChooser;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JMenu;
    import javax.swing.JMenuBar;
    import javax.swing.JMenuItem;
    import javax.swing.JPanel;
     
    @SuppressWarnings("serial")
    public class Frame extends JFrame implements ActionListener {
     
    	private JPanel pan = new JPanel();
    	private JPanel jpl = new JPanel();
    	private JPanel cont = new JPanel();
     
    	private JButton btn1 = new JButton("Ouvrir");
    	private JButton btn2 = new JButton("Copier");
     
    	private Box panneauBouton = Box.createVerticalBox();
     
    	private JMenuBar menuBar = new JMenuBar();
     
    	private JMenu ficher = new JMenu("Ficher"),
    			aPropos = new JMenu("À propos");
     
    	private JMenuItem quitter = new JMenuItem("Quitter"),
    			aProposItem = new JMenuItem("Lisez-moi");  
     
    	public Frame(){
    		//Création de la fenêtre.
    		this.setTitle("Logiciel");
    		this.setSize(800, 500);
    		this.setResizable(false);
    		this.setLocationRelativeTo(null);
    		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		//On rend la fenêtre visible.
    		this.setVisible(true);
     
    		cont.setLayout(new BorderLayout());
     
    		panneauBouton.setPreferredSize(new Dimension(360, 400));
     
    		btn1.setMaximumSize(new Dimension(200, 30));
    		btn1.setAlignmentX(JButton.CENTER_ALIGNMENT);
     
    		btn2.setMaximumSize(new Dimension(200, 30));
    		btn2.setAlignmentX(JButton.CENTER_ALIGNMENT);
     
    		jpl.setBounds(20, 20, 360, 400);
    		jpl.setBackground(Color.BLUE);
     
    		pan.setBackground(Color.GREEN);
    		pan.setBounds(380, 20, 360, 380);
     
    		cont.add(jpl, BorderLayout.WEST);
    		cont.add(pan, BorderLayout.CENTER);
     
    		this.setContentPane(cont);
     
    		this.initMenu();
     
    	}
     
    	private void initMenu(){
    		//Menu ficher
    		ficher.add(quitter);
    		//Pour quitter l'application
    		quitter.addActionListener(new ActionListener(){
    			public void actionPerformed(ActionEvent event){
    				System.exit(0);
    			}
    		});
     
    		ficher.add(quitter);
     
    		//Menu À propos
    		aPropos.add(aProposItem);
     
    		//Ajout des menus dans la barre de menus
    		menuBar.add(ficher);
    		menuBar.add(aPropos);
     
    		//Ajout de la barre de menus sur la fenêtre
    		this.setJMenuBar(menuBar);
     
    		panneauBouton.add(Box.createVerticalStrut(150));
    		panneauBouton.add(btn1);
    		panneauBouton.add(Box.createVerticalStrut(50));
    		panneauBouton.add(btn2);
     
    		jpl.add(panneauBouton);
     
    		btn1.addActionListener(new ActionListener(){
    			public void actionPerformed(ActionEvent e) {
    				if(e.getSource()== btn1){
    					//Création d'un objet de type String.
    					@SuppressWarnings("unused")
    					String fichierImage;
    					//Création d'un composant JFileChooser.
    					JFileChooser dialogue = new JFileChooser();
    					//Ouvrir une boîte de dialogue qui permet
    					//la recherche d'un fichier.
    					int result = dialogue.showOpenDialog(Frame.this);
    					//Si un fichier a été sélectionné.
    					if(result == JFileChooser.APPROVE_OPTION) {
    						fichierImage = dialogue.getSelectedFile().getAbsolutePath();
    					}
    				}
     
    				@SuppressWarnings("unused")
    				class panneau extends JPanel {
     
    					private JPanel pan = new JPanel();
    					private JPanel jpl = new JPanel();
    					private JPanel cont = new JPanel();
     
    					private BufferedImage image;
     
    					public void paintComponent(Graphics g, String fichierImage){
    						super.paintComponent(g);
     
    						try {
    							BufferedImage image = ImageIO.read(new File(fichierImage));
    							ImageIcon icon = new ImageIcon(image);
    							JLabel lab = new JLabel(icon);
    							pan.setLayout(new BorderLayout());
    							pan.add(lab, BorderLayout.CENTER);
     
    							g.drawImage(image, 200, 200, this );
     
    							this.setVisible(true);
     
    						} catch (IOException e) {
    							e.printStackTrace();
    						}
     
    						pan.setVisible(true);
    						repaint();
     
     
    					}
    				}
    			}
    		});
    	}
     
    	@Override
    	public void actionPerformed(ActionEvent arg0) {
    		// TODO Stub de la méthode généré automatiquement
     
    	}
    }
    Merci encore.

  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
    Salut,

    Il y a tellement de problèmes dans ton code que je ne sais pas où commencer. Rien que dans la méthode actionPerformed() de l'ActionListener affecté à btn1 (je n'ai pas regardé le reste).



    1. Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      if(result == JFileChooser.APPROVE_OPTION) {
             fichierImage = dialogue.getSelectedFile().getAbsolutePath();
      }
      Lorsque l'utilisateur choisi un fichier et valide sa sélection, tout ce que code fait c'est mettre le path absolu du fichier sélectionné dans la variable fichierImage. C'est tout. Et ceci ne risque pas d'afficher quoique ce soit : on met juste une String dans une variable. A moins qu'un autre thread aille chercher la valeur de cette variable en parallèle. Mais comme cette variable est locale au bloc du if if(e.getSource()== btn1){ : elle ne peut être accèdée nulle part ailleurs. Donc aucun risque que ton image puisse être affichée.
    2. Ensuite, dans la méthode actionPerformed, on définit une classe (locale à la méthode actionPerformed), qui constitue à priori un JPanel pour afficher une image :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      @SuppressWarnings("unused")
      class panneau extends JPanel {
      L'annotation est éloquente : aucune instance de cette classe n'est jamais construite. Aucun risque que le panel soit affiché quelque part. En plus, même si l'instance de JPanel était construite, il faudrait la mettre dans la fenêtre (dans un conteneur quelconque), sinon le JPanel ne sera pas plus affiché.
    3. Quant à cette méthode :
      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 void paintComponent(Graphics g, String fichierImage){
      						super.paintComponent(g);
       
      						try {
      							BufferedImage image = ImageIO.read(new File(fichierImage));
      							ImageIcon icon = new ImageIcon(image);
      							JLabel lab = new JLabel(icon);
      							pan.setLayout(new BorderLayout());
      							pan.add(lab, BorderLayout.CENTER);
       
      							g.drawImage(image, 200, 200, this );
       
      							this.setVisible(true);
       
      						} catch (IOException e) {
      							e.printStackTrace();
      						}
       
      						pan.setVisible(true);
      						repaint();
       
       
      					}
      c'est un mélange confus de ce qu'il faudrait plus ou moins faire, mais pas exactement, et de ce qu'il ne faut surtout jamais faire.

      1. Premièrement, la méthode paintComponent(Graphics) est appelée par Swing pour dessiner le composant, mais la méthode paintComponent(Graphics, String) non : Swing ne la connait même pas. Je suppose que le but était d'utiliser la variable crée dans l'autre bloc, vu qu'elle a le même nom, mais ce n'est pas du tout comme ça qu'on fait. Il faut revoir complètement les bases sur les variables et les paramètres, et en particulier les paramètres d'un constructeur : car c'est au constructeur du JPanel qu'il faudrait passer la variable fichierImage éventuellement, ou la déclarée final dans la méthode actionPerformed, pour pouvoir l'utiliser comme variable dans paintComponent(), mais surtout ne pas en faire un paramètre d'une méthode redéfinissant une méthode de Swing.
      2. Ensuite, éviter de faire des entrées/sorties (en particulier des accès disque) dans la partie "redessin" : ici tu lis un fichier, ce qui est une opération relativement lente, qui va être faite à chaque fois que le JPanel sera dessiné : c'est inutile et consommateur en temps et en mémoire.
      3. Code : Sélectionner tout - Visualiser dans une fenêtre à part
        1
        2
        3
        4
        5
        6
        ImageIcon icon = new ImageIcon(image);
        							JLabel lab = new JLabel(icon);
        							pan.setLayout(new BorderLayout());
        							pan.add(lab, BorderLayout.CENTER);
         
        							g.drawImage(image, 200, 200, this );
        Pourquoi utiliser un JLabel pour afficher l'image , et la dessiner aussi dans le fond du JPanel ? L'un des deux suffirait à priori, et il y a de toute façon de fortes chances que l'un soit caché par l'autre, dans le cas hypothétique où le JPanel serait affiché.
      4. rendre visible un JPanel qui n'est pas mis dans un conteneur ne sert à rien : il n'est pas affiché. Le faire dans paintComponent() ne sert à rien : si on le fait c'est pour l'afficher, donc c'est qu'il ne l'est pas, donc paintComponent n'a pas de raison d'être appelé, donc il ne sera pas rendu visible... et s'il l'est déjà, pourquoi le faire ?
      5. ne jamais faire un repaint() dans paintComponent : repaint() demande le redessin, donc va passer par un appel à paintComponent(), qui va faire un repaint(), donc demander le redessin, donc faire paintComponent... on voit que ça fait une boucle infinie qui redessine inutilement et qui plombe les performances.


    Ensuite, 2 possibilités : la plus simple, qu'il y ait déjà un JPanel prévu pour afficher l'image. Il est créé avec les autres, lors de la création de la fenêtre : disons que c'est le pan que tu créés ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public class Frame extends JFrame implements ActionListener {
     
    	private JPanel pan = new JPanel();
     
            /*...*/
    Et bien dans ton bouton tu n'as qu'à :
    1. lire le fichier sélectionné au moment où il est sélectionné
    2. dans une BufferedImage, ou directement dans une ImageIcon,
    3. et créé un JLabel avec, que tu mets dans pan

    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
    if(result == JFileChooser.APPROVE_OPTION) {
    						fichierImage = dialogue.getSelectedFile().getAbsolutePath(); // on récupère la sélection
                                                    try {
    							BufferedImage image = ImageIO.read(new File(fichierImage)); // lit l'image
    							ImageIcon icon = new ImageIcon(image); // on créé l'image icon
    							JLabel lab = new JLabel(icon);
                                                            pan.removeAll(); // pour éviter des problèmes de conflits, on supprime les composants déjà présents dans le panel
    							pan.setLayout(new BorderLayout());
    							pan.add(lab, BorderLayout.CENTER); 
                                                            pan.revalidate(); // on avertit Swing qu'on a changé quelque chose susceptible d'affecter le layout
                                                            pan.repaint(); // on demande à Swing de redessiner
     
    						} catch (IOException e) {
    							e.printStackTrace();
                                                    }
    					}
    On pourrait faire un peu plus simple : inutile de passer par une String (fichierImage) pour récréer un File ensuite...

    Ceci affiche l'image dans sa taille d'origine. Tu évoques une histoire de redimensionnement dans ta première question. S'il est question de dessiner l'image dans la taille du JPanel qui l'affiche, alors, autre possibilité, il faut passer effectivement par un JPanel dont on redéfinit la méthode paintComponent :


    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
    f(result == JFileChooser.APPROVE_OPTION) {
    						File fichierImage = dialogue.getSelectedFile(); // on récupère la sélection
                                                    try {
    							final BufferedImage image = ImageIO.read(fichierImage); // lit l'image : la variable est final pour pouvoir être utilisée dans la classe anonyme créée juste après 
    							JPanel lab = new JPanel() {
                                                                 protected void paintComponent(Graphics g) {
                                                                         g.drawImage(image, getWidth(), getHeight(), null); // on dessine l'image dans la taille du panel (c'est la même variable que juste au dessus, la final BufferedImage
                                                                 }
                                                            };
                                                            pan.removeAll(); // pour éviter des problèmes de conflits, on supprime les composants déjà présents dans le panel
    							pan.setLayout(new BorderLayout()); 
    							pan.add(lab, BorderLayout.CENTER); 
                                                            pan.revalidate(); // on avertit Swing qu'on a changé quelque chose susceptible d'affecter le layout
                                                            pan.repaint(); // on demande à Swing de redessiner
     
    						} catch (IOException e) {
    							e.printStackTrace();
                                                    }
    					}
    Attention, cette méthode aura pour effet d'afficher l'image dans la taille du conteneur, donc éventuellement sans respect des proportions de l'image (la hauteur et la largeur peuvent varier indépendamment entre elles et indépendamment des proportions de l'image).
    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
    employé
    Inscrit en
    Mars 2015
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : employé

    Informations forums :
    Inscription : Mars 2015
    Messages : 31
    Par défaut
    Bonsoir Joël,

    Merci de me répondre, c'est un cours magistral que tu me donne et j'en suis très heureux. Ce soir il est un peu tard mais dès demain je me plonge dans le code: lire, lire et relire ce code et surtout le comprendre. IL y a des méthodes que je ne connais pas donc je vais pouvoir me renseigner sur ces méthodes.
    Merci pour tout.

  6. #6
    Membre averti
    Homme Profil pro
    employé
    Inscrit en
    Mars 2015
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : employé

    Informations forums :
    Inscription : Mars 2015
    Messages : 31
    Par défaut
    Bonsoir à tous,

    J'ai restructuré le code et une image s'affiche dans le panel pan mais c'est une partie de la boîte de dialogue JFileChooser. Je dois avoir encore une connerie dans le code. Quant au redimensionnement, je parlais des 2 panel (jpl, pan) mais comme je lai écrit, il n'y a aucun effet sur ces panel et je pense donner des valeurs à l'image pour qu'elle soit plus petite que pan.
    Je met le code modifié:

    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
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
     
    package logiciel_fenetre;
     
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.IOException;
     
    import javax.imageio.ImageIO;
    import javax.swing.Box;
    import javax.swing.ImageIcon;
    import javax.swing.JButton;
    import javax.swing.JFileChooser;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JMenu;
    import javax.swing.JMenuBar;
    import javax.swing.JMenuItem;
    import javax.swing.JPanel;
     
    @SuppressWarnings("serial")
    public class Frame extends JFrame implements ActionListener {
     
    	private JPanel pan = new JPanel();
    	private JPanel jpl = new JPanel();
    	private JPanel cont = new JPanel();
     
    	private JButton btn1 = new JButton("Ouvrir");
    	private JButton btn2 = new JButton("Copier");
     
    	private Box panneauBouton = Box.createVerticalBox();
     
    	private JMenuBar menuBar = new JMenuBar();
     
    	private JMenu ficher = new JMenu("Ficher"),
    			aPropos = new JMenu("À propos");
     
    	private JMenuItem quitter = new JMenuItem("Quitter"),
    			aProposItem = new JMenuItem("Lisez-moi");  
     
    	public Frame(){
    		//Création de la fenêtre.
    		this.setTitle("Logiciel");
    		this.setSize(800, 500);
    		this.setResizable(false);
    		this.setLocationRelativeTo(null);
    		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		//On rend la fenêtre visible.
    		this.setVisible(true);
     
    		cont.setLayout(new BorderLayout());
     
    		panneauBouton.setPreferredSize(new Dimension(360, 400));
     
    		btn1.setMaximumSize(new Dimension(200, 30));
    		btn1.setAlignmentX(JButton.CENTER_ALIGNMENT);
     
    		btn2.setMaximumSize(new Dimension(200, 30));
    		btn2.setAlignmentX(JButton.CENTER_ALIGNMENT);
     
    		jpl.setBounds(20, 20, 360, 500);
    		jpl.setBackground(Color.BLUE);
     
    		pan.setBackground(Color.GREEN);
    		pan.setBounds(380, 20, 360, 500);
     
    		cont.add(jpl, BorderLayout.WEST);
    		cont.add(pan, BorderLayout.CENTER);
     
    		this.setContentPane(cont);
     
    		this.initMenu();
     
    	}
     
    	private void initMenu(){
    		//Menu ficher
    		ficher.add(quitter);
    		//Pour quitter l'application
    		quitter.addActionListener(new ActionListener(){
    			public void actionPerformed(ActionEvent event){
    				System.exit(0);
    			}
    		});
     
    		ficher.add(quitter);
     
    		//Menu À propos
    		aPropos.add(aProposItem);
     
    		//Ajout des menus dans la barre de menus
    		menuBar.add(ficher);
    		menuBar.add(aPropos);
     
    		//Ajout de la barre de menus sur la fenêtre
    		this.setJMenuBar(menuBar);
     
    		panneauBouton.add(Box.createVerticalStrut(150));
    		panneauBouton.add(btn1);
    		panneauBouton.add(Box.createVerticalStrut(50));
    		panneauBouton.add(btn2);
     
    		jpl.add(panneauBouton);
     
    		btn1.addActionListener(new ActionListener(){
    			public void actionPerformed(ActionEvent e) {
    				if(e.getSource()== btn1){
    					//Création d'un objet de type String.
    					String fichierImage;
    					//Création d'un composant JFileChooser.
    					JFileChooser dialogue = new JFileChooser();
    					//Ouvrir une boîte de dialogue qui permet
    					//la recherche d'un fichier.
    					int result = dialogue.showOpenDialog(Frame.this);
    					//Si un fichier a été sélectionné.
    					if(result == JFileChooser.APPROVE_OPTION) {
    						fichierImage = dialogue.getSelectedFile().getAbsolutePath();//On récupère la sélection
     
    				try {
    					//Lit l'image: la variable est final pour pouvoir être utilisée dans la classe créee juste après
    							final BufferedImage image = ImageIO.read(new File(fichierImage));
    							JPanel lab = new JPanel(){
    								protected void paintComponent(Graphics g) {
    									//On dessine l'image dans la taille du panel ( c'est la même variable que juste au-dessus,
    									//la final BuferredImage
    									g.drawImage(image, getWidth(), getHeight(), null);
    								}
    							};
     
    							pan.removeAll();//Pour éviter des problèmes de conflits, on supprime les composants déjà présent dans le panel
    							pan.setLayout(new BorderLayout());
    							pan.add(lab, BorderLayout.CENTER);
    							pan.revalidate();//On avertit swing qu'on a changé quelque chose susceptible d'affecter le layout
    							pan.repaint();//On demande à swing de redessiner
     
    						} catch (IOException IO) {
    							IO.printStackTrace();
    						}
    					}
    				}
    			}
    		});
    	}
     
    	@Override
    	public void actionPerformed(ActionEvent arg0) {
    		// TODO Stub de la méthode généré automatiquement
     
    	}
    }
    Merci pour vôtre aide.

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

Discussions similaires

  1. Afficher une image après l'upload
    Par Jean-Mouloud dans le forum Langage
    Réponses: 1
    Dernier message: 24/05/2012, 17h42
  2. Réponses: 2
    Dernier message: 12/01/2012, 23h12
  3. comment afficher une image après Kmeans
    Par ryma* dans le forum Images
    Réponses: 0
    Dernier message: 25/05/2011, 23h43
  4. Réponses: 3
    Dernier message: 27/11/2008, 17h57
  5. Réponses: 3
    Dernier message: 06/07/2005, 13h57

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