Partage
  • Partager sur Facebook
  • Partager sur Twitter

boite de dialogue JFileChooser

Récupérer fichier image

    7 février 2016 à 14:39:54

    Bonjour à tous,

    J'essaie de me dépatouiller pour récupérer un fichier image après une selection dans une boite de dialogue JFileChooser et l'afficher dans un panneau graphique. Je ne sais comment faire pour récupérer la source du fichier. Pourriez-vous m'aider ?

    Voici les codes: 

    Main

    package Logiciel;
    
    import logiciel_fenetre.Fenetre;
    
    public class Main {
    
    	public static void main(String[] args) {
    		
    		new Fenetre ();
    	}
    
    }
    

    fenetre

    package logiciel_fenetre;
    
    /**
     * @Author Pascal DV
     * Version 1
     * Logiciel OCR et de garde de mise en page.
     */
    
    import java.awt.BorderLayout;
    import java.awt.Component;
    import java.awt.Dimension;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.io.File;
    
    import javax.swing.Box;
    import javax.swing.JButton;
    import javax.swing.JFileChooser;
    import javax.swing.JFrame;
    import javax.swing.JMenu;
    import javax.swing.JMenuBar;
    import javax.swing.JMenuItem;
    import javax.swing.JPanel;
    import javax.swing.filechooser.FileNameExtensionFilter;
    
    @SuppressWarnings("serial")
    public class Fenetre extends JFrame{
    	
    	public static final String newline = null;
    
    	//Création d'un panneau pour insérer un graphique.
    	private Panneau pan = new Panneau();
    	
    	//Création d'un conteneur.
    	private JPanel container = new JPanel();
    	
    	//Ajout d'un JPanel pour inclure la box afin de la positionner.
    	private JPanel jpl = new JPanel();
    	
    	//Creation de boutons.
    	private JButton btn1 = new JButton("Ouvrir");
    	private JButton btn2 = new JButton("Copier");
    	private JButton btn3 = new JButton("Effacer");
    	
    	//Création d'une box pour positionner nos boutons verticalement.
    	Box panneauBouton = Box.createVerticalBox();
    	
    	//Ajout d'une barre de menu.
    	private JMenuBar menuBar = new JMenuBar();
    	
    	//Ajout d'un menu.
    	private JMenu ficher = new JMenu("Ficher"),
    			aPropos = new JMenu("À propos");
    	
    	private JMenuItem quitter = new JMenuItem("Quitter"),
    			aProposItem = new JMenuItem("Lisez-moi");	
    	
    	public Fenetre(){
    	//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);
    	
    		//Redimension de la box.
    		panneauBouton.setPreferredSize(new Dimension(360, 400));
    		
    		// Redimension des boutons.
    		btn1.setMaximumSize(new Dimension(200, 30));
    		btn1.setAlignmentX(Component.CENTER_ALIGNMENT);
    		
    		btn2.setMaximumSize(new Dimension(200, 30));
    		btn2.setAlignmentX(Component.CENTER_ALIGNMENT);
    		
    		btn3.setMaximumSize(new Dimension(200, 30));
    		btn3.setAlignmentX(Component.CENTER_ALIGNMENT);
    		
    		//Position du JPanel
    		jpl.setBounds(20, 20, 360, 400);
    		
    		//Ajout des JPanel dans le conteneur
    		container.add(jpl);
    		container.setLayout(new BorderLayout());
    		container.add(pan, BorderLayout.CENTER);
    		
    		this.setContentPane(container);
    		
    		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(125));
    		panneauBouton.add(btn1);
    		panneauBouton.add(Box.createVerticalStrut(25));
    		panneauBouton.add(btn2);
    		panneauBouton.add(Box.createVerticalStrut(25));
    		panneauBouton.add(btn3);
    		
    		jpl.add(panneauBouton, BorderLayout.WEST);
    		
    		btn1.addActionListener(new ActionListener(){
    			public void actionPerformed(ActionEvent e){
    				showOpenFileDialog();
    		}
    	});
    }
    	
    	private void showOpenFileDialog() {
    		JFileChooser fileChooser = new JFileChooser();
            fileChooser.setCurrentDirectory(new File(System.getProperty("user.home")));
            fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
            fileChooser.addChoosableFileFilter(new FileNameExtensionFilter("Images", "jpg", "png", "gif", "bmp"));
            fileChooser.setAcceptAllFileFilterUsed(true);
            int result = fileChooser.showOpenDialog(this);
            if (result == JFileChooser.APPROVE_OPTION) {
                File selectedFile = fileChooser.getSelectedFile();
                System.out.println("Selected file: " + selectedFile.getAbsolutePath());
            }
        }
    }
    
    
    		
    		
    
    
    
    	
    

    panneau

    package logiciel_fenetre;
    
    
    import java.awt.Graphics;
    import java.awt.Image;
    import java.io.File;
    import java.io.IOException;
    
    import javax.imageio.ImageIO;
    import javax.swing.JPanel;
    
    @SuppressWarnings("serial")
    public class Panneau extends JPanel{
    	public void paintComponent(Graphics g){	
    		g.drawRect(400, 20, 360, 400);
    		Image img;
    		try {
    			img = ImageIO.read(new File("Image.jpg"));
    			g.drawImage(img, 360, 380, this);
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    	}
    }
    

    extensionfichier

    package logiciel_fenetre;
    
    import java.io.File;
    
    import javax.swing.filechooser.FileFilter;
    
    public abstract class ExtensionFichier extends FileFilter {
    	 private String extension;
    	 private String description;
    	    
    	 public ExtensionFichier(String extension, String description) {
    	        this.extension = extension;
    	        this.description = description;
    	    }
    	 
    	 public boolean accept(File file) {
    	        if (file.isDirectory()) {
    	            return true;
    	        }
    	        return file.getName().endsWith(extension);
    	 }
    	 
    	 public String getDescription() {
    	        return description + String.format(" (*%s)", extension);
    	 }
    }
    

    Merci pour toutes vos réponses.




    • Partager sur Facebook
    • Partager sur Twitter
    Mieux vaut tard que jamais.
      7 février 2016 à 16:14:29

                      JFileChooser dialogue = new JFileChooser("chemin vers le dossier");
      
      
                      dialogue.showOpenDialog(null);
                      dialogue.getSelectedFile();
      • Partager sur Facebook
      • Partager sur Twitter
        7 février 2016 à 18:19:36

        Merci de me répondre rapidement, j'ai omis d'écrire que je suis débutant et que j'ai peut-être mal exprimé mon problème. il y a une interface graphique et un bouton "ouvrir", quand je clique sur ce bouton une boite de dialogue JFileChooser s'ouvre et je sélectionne un fichier image et je voudrai que l'image s'affiche dans le contexte graphique. L'utilisateur doit pouvoir ouvrir des fichiers sur son dd.
        • Partager sur Facebook
        • Partager sur Twitter
        Mieux vaut tard que jamais.
          7 février 2016 à 23:22:00

          alors une fois l'image récupérée, tu peux récupérer son absolutePath et l'utiliser pour insérer l'image dans un panel.

          Pour insérer une image dans un panel, tu fais un truc comme ça :

          ImageIcon icon = new ImageIcon("absolutePath vers ton fichier");
          JLabel img = new JLabel(icon);
          tonPanel.add(img);



          -
          Edité par Triterium 7 février 2016 à 23:22:16

          • Partager sur Facebook
          • Partager sur Twitter
            8 février 2016 à 18:33:39

            Bonsoir Triterium,

            Est-ce-que je dois créer une nouvelle classe ?, dois-je placer ce code dans la classe Fenêtre ou Panneau ?

            • Partager sur Facebook
            • Partager sur Twitter
            Mieux vaut tard que jamais.
              8 février 2016 à 18:38:04

              Bonsoir zatopec!

              Dans ta classe Panneau, à la place de "Image.jpg", il faut mettre juste le chemin absolu vers l'image donné par le JFileChooser (dialog.getSelectedFile().getAbsolutePath()). Pas besoin d'utiliser le reste du code du coup ^^ (j'avais pas vu que tu avais déjà un panel qui affichait une image).

              • Partager sur Facebook
              • Partager sur Twitter
                8 février 2016 à 20:36:42

                Re,

                cette fois , plus d'interface mais un nullPointerException. Voici le printStackTrace:

                Exception in thread "main" java.lang.NullPointerException

                at logiciel_fenetre.Panneau.<init>(Panneau.java:24)

                at logiciel_fenetre.Fenetre.<init>(Fenetre.java:32)

                at Logiciel.Main.main(Main.java:9)

                panneau

                package logiciel_fenetre;
                
                
                import java.awt.Graphics;
                import java.awt.Image;
                import java.io.File;
                import java.io.IOException;
                
                import javax.imageio.ImageIO;
                import javax.swing.JPanel;
                
                
                @SuppressWarnings({ "serial" })
                public class Panneau extends JPanel{
                	public void paintComponent(Graphics g){	
                		g.drawRect(400, 20, 360, 400);
                	}
                	
                	Image img;
                	
                	{
                    try {
                        img = ImageIO.read(new File("C:/Users/PASCAL ET VIVIANE/Pictures/gaya/gaya 001.jpg"));
                        Graphics g = null;
                		g.drawImage(img, 400, 20, this );
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                }
                



                • Partager sur Facebook
                • Partager sur Twitter
                Mieux vaut tard que jamais.
                  8 février 2016 à 21:25:41

                  Bon j'ai l'impression que tu vas un peu trop vite en besogne ^^

                  Je te conseille d'abord d'afficher une image proprement dans un panel. Puis ensuite d'essayer de changer l'image de ce panel avec un simple bouton (quand tu cliques, ça change d'image). Tout ça en n'utilisant pas de chemin absolu gravé dans ton programme (pas de : "C:/Users/PASCAL ET VIVIANE/Pictures/gaya/gaya 001.jpg"). Enfin, essaies de récupérer ton image via un JFileChooser. Parce qu'il me semble que tu ne comprends pas ce que tu fais. Avec le code que j'ai donné, si tu as compris le swing et un peu java tu peux t'en sortir.

                  • Partager sur Facebook
                  • Partager sur Twitter
                    9 février 2016 à 18:36:32

                    Ok, donc je vais créer un nouveau projet avec une fenêtre, un JPanel et un bouton plus le code que tu m'a donné. Il est vrai que m'a logique n'est peut-être pas celle de java. Java n'est pas si facile a appréhender en tant qu'autodidacte. Merci pour tes conseil et je vais essayer d'arriver à un résultat. je te tiens au courant dès possible.
                    • Partager sur Facebook
                    • Partager sur Twitter
                    Mieux vaut tard que jamais.
                      15 février 2016 à 20:33:16

                      Bonsoir Triterium,

                      J'ai affiché une image dans une fenêtre puis à l'aide d'un bouton j'ai fait apparaître une image après le clic du bouton. Sur le net, je ne trouve pas de sujet qui traite la façon de changer d'image à chaque clic du bouton (une piste peut-être ?). Sachant que l'image est à la racine du projet. Je vais continuer à chercher.

                      A+

                      • Partager sur Facebook
                      • Partager sur Twitter
                      Mieux vaut tard que jamais.
                        15 février 2016 à 20:53:47

                        Mettons que tu aies 2 images à la racine du projet.

                        tu ferais un truc du genre :

                        class MyImagePanel extends JPanel{
                            private String cheminDeLImage;
                        
                            public MyImagePanel(String chemin){
                                this.cheminDeLImage = chemin;
                            }
                        
                            @Override
                            public void paintComponent(Graphics g){
                                try {
                                    img = ImageIO.read(new File(this.cheminDeLImage));
                                    g.drawImage(img, 360, 380, this);
                                } catch (IOException e) {
                                    e.printStackTrace();
                                }
                            }
                        }
                        
                        public class Fenetre extends JFrame implements ActionListener{
                             
                           
                             private String chemin;
                            public Fenetre(){
                        		//Création de la fenêtre.
                        		this.setTitle("Logiciel");
                        		this.setPreferredSize(800, 500);
                        		this.setResizable(false);
                        		this.setLocationRelativeTo(null);
                        		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                        		//On rend la fenêtre visible.
                        		this.setVisible(true);
                        		chemin = "images/image1.jpg";
                        		//Redimension de la box.
                        		this.setLayout(new BorderLayout());
                        		JButton jb = new JButton("changer l'image");
                        		jb.addActionListener(this);
                        		this.add(jb, BorderLayout.NORTH);
                                 
                            }
                        	public void actionPerformed(ActionEvent e) {
                        		//Attention ici je ne teste pas quel bouton est appelé. Dans le cas de plusieurs boutons, faire le test.
                        		
                        		//on teste si le chemin est égal à une image ou une autre et on change
                        		if(this.chemin.equals("images/image1.jpg")){
                        			this.chemin = "images/image2.jpg";
                        		}
                        		else{
                        				this.chemin = "images/image1.jpg";
                        		}
                        		this.add(new MyImagePanel(this.chemin), BorderLayout.CENTER); // on ajoute le panel au centre
                        		//Attention à tester s'il existe déjà un panel dans le centre du layout, et à l'enlever si besoin
                        		//on redessine la frame
                        		this.repaint(); 
                        		this.revalidate();
                        	}
                        }


                        C'est vraiment grosso modo, dis moi si tu ne comprends pas tout!

                        • Partager sur Facebook
                        • Partager sur Twitter
                          17 février 2016 à 20:05:36

                          Bonjour Triterium,

                          Je t'ai expédié un message hier mais j'ai du faire une mauvaise manip. Bref, c'est super ton code mais je n'ai pas le résultat escompté. J'ai surement mal reconstruit le programme.En tout cas quand je raisonnerai de cette façon, j'en serai très heureux. Je comprend ce code. je mets les 3 classes et peux-tu m'expliquer les erreurs que j'ai commis.

                          Voici les codes:

                          MainImage

                          package imagePanel;
                          
                          public class MainImage {
                          
                          	public static void main(String[] args) {
                          		 @SuppressWarnings("unused")
                          		Fenetre fen = new Fenetre();
                          
                          	}
                          
                          }
                          

                          Fenêtre

                          package imagePanel;
                          
                          import java.awt.BorderLayout;
                          import java.awt.event.ActionEvent;
                          import java.awt.event.ActionListener;
                          
                          import javax.swing.JButton;
                          import javax.swing.JFrame;
                          
                          @SuppressWarnings("serial")
                          public class Fenetre extends JFrame implements ActionListener{
                          	String chemin;
                          	
                              public Fenetre(){
                                  //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);
                                  chemin = "images/IMGP0866.jpg";
                                  //Redimension de la box.
                                  this.setLayout(new BorderLayout());
                                  JButton jb = new JButton("changer l'image");
                                  jb.addActionListener(this);
                                  this.add(jb, BorderLayout.NORTH);
                                    
                              }
                              public void actionPerformed(ActionEvent e) {
                                  //Attention ici je ne teste pas quel bouton est appelé. Dans le cas de plusieurs boutons, faire le test.
                          	}
                          }

                          MyImagePanel

                          package imagePanel;
                          
                          import java.awt.BorderLayout;
                          import java.awt.Graphics;
                          import java.awt.image.BufferedImage;
                          import java.io.File;
                          import java.io.IOException;
                          
                          import javax.imageio.ImageIO;
                          import javax.swing.JPanel;
                          
                          @SuppressWarnings("serial")
                          class MyImagePanel extends JPanel{
                              private String cheminDeLImage;
                           
                              public MyImagePanel(String chemin){
                                  this.cheminDeLImage = chemin;
                                 
                              }
                           
                              public void paintComponent(Graphics g){
                                  try {
                                      BufferedImage img = ImageIO.read(new File(this.cheminDeLImage));
                                      g.drawImage(img, 360, 380, this);
                                  } catch (IOException e) {
                                      e.printStackTrace();
                                  }
                              
                                  //on teste si le chemin est égal à une image ou une autre et on change
                                  if(this.cheminDeLImage.equals("images/IMGP0866.jpg")){
                                  	this.cheminDeLImage = "images/IMGP0870.jpg";
                                  }
                                  else{
                                  	this.cheminDeLImage = "images/IMGP0866.jpg";
                                  }
                                  this.add(new MyImagePanel(this.cheminDeLImage), BorderLayout.CENTER); // on ajoute le panel au centre
                                  //Attention à tester s'il existe déjà un panel dans le centre du layout, et à l'enlever si besoin
                                  //on redessine la frame
                                  this.repaint();
                                  this.revalidate();
                              }
                          }


                          Merci pour ta patience.


                          • Partager sur Facebook
                          • Partager sur Twitter
                          Mieux vaut tard que jamais.
                            17 février 2016 à 21:09:04

                            Tu as un truc pas trop mal! Tu oublies cependant de lier ton bouton à l'ajout de ton panel! Du coup ton bouton ne fait rien. Que fait ton programme actuellement?

                            (indice, il faut que tu mettes le JPanel dans ta classe fenêtre en attibut de classe)

                            • Partager sur Facebook
                            • Partager sur Twitter
                              19 février 2016 à 20:12:58

                              encore une fois le message  s'est envolé. quand j'exécute le programme , la fenêtre s'ouvre avec le bouton mais pas d'image. Qu'entends-tu par lier le bouton à l'ajout du panel ? (je ne connais peut-être pas). j'ai aussi instancié JPanel dans la fenêtre

                              • Partager sur Facebook
                              • Partager sur Twitter
                              Mieux vaut tard que jamais.
                                20 février 2016 à 0:24:57

                                Dans le code mis ci-dessus, tu n'ajoutes pas le panel à la fenetre.

                                Sinon quand je parle de lier le bouton à l'ajout du panel, je veux dire qu'il faut bien écrire dans ton programme l'action que va faire ton bouton quand tu vas cliquer dessus! Connais-tu les ActionListener?

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  20 février 2016 à 11:16:17

                                  Donc il faut ajouter :
                                   this.add(new MyImagePanel(this.cheminDeLImage), BorderLayout.CENTER);
                                  sous la la classe fenêtre ou j'ai déclarais JPanel. Je connais un peu ActionListener , je dois coder avec un if et un getSource ?
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                  Mieux vaut tard que jamais.
                                    20 février 2016 à 14:50:58

                                    Yep, pour que quand tu cliques sur le bouton ça fasse une action (donc n'oublie pas de mettre le panel en attribut de classe pour pouvoir agir dessus avec le ActionListener)!
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      20 février 2016 à 19:48:24

                                      Bon, nouvelle erreur sur string chemin; Je te remet le code .

                                      package imagePanel;
                                      
                                      import java.awt.BorderLayout;
                                      import java.awt.event.ActionEvent;
                                      import java.awt.event.ActionListener;
                                      
                                      import javax.swing.JButton;
                                      import javax.swing.JFrame;
                                      
                                      @SuppressWarnings("serial")
                                      public  class Fenetre extends JFrame implements ActionListener{
                                      	String chemin ; 
                                      		
                                      	this.add(new MyImagePanel(this.chemin), BorderLayout.CENTER);
                                      	// on ajoute le panel au centre
                                          //Attention à tester s'il existe déjà un panel dans le centre du layout, et à l'enlever si besoin
                                      	
                                      	 public Fenetre(){
                                              //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);
                                              chemin = "images/IMGP0866.jpg";
                                              this.setLayout(new BorderLayout());
                                              JButton jb = new JButton("changer l'image");
                                              
                                              this.add(jb, BorderLayout.NORTH);
                                              
                                              jb.addActionListener(new ActionListener(){
                                      	    	public void actionPerformed(ActionEvent e) {
                                      	    		if(e.getSource()== jb){
                                      	    		//Attention ici je ne teste pas quel bouton est appelé. Dans le cas de plusieurs boutons, faire le test.
                                             }
                                          }
                                      });
                                          }
                                      
                                      	@Override
                                      	public void actionPerformed(ActionEvent e) {
                                      		// TODO Stub de la méthode généré automatiquement
                                      		
                                      	}
                                          	
                                      package imagePanel;
                                      
                                      import java.awt.Graphics;
                                      import java.awt.image.BufferedImage;
                                      import java.io.File;
                                      import java.io.IOException;
                                      
                                      import javax.imageio.ImageIO;
                                      import javax.swing.JPanel;
                                      
                                      @SuppressWarnings("serial")
                                      class MyImagePanel extends JPanel{
                                          private String cheminDeLImage;
                                       
                                          public MyImagePanel(String chemin){
                                              this.cheminDeLImage = chemin;
                                             
                                          }
                                       
                                          public void paintComponent(Graphics g){
                                              try {
                                                  BufferedImage img = ImageIO.read(new File(this.cheminDeLImage));
                                                  g.drawImage(img, 360, 380, this);
                                                 
                                              } catch (IOException e) {
                                                  e.printStackTrace();
                                              }
                                          
                                              //on teste si le chemin est égal à une image ou une autre et on change
                                              if(this.cheminDeLImage.equals("images/IMGP0866.jpg")){
                                              	this.cheminDeLImage = "images/IMGP0870.jpg";
                                              }
                                              else{
                                              	this.cheminDeLImage = "images/IMGP0866.jpg";
                                              }
                                              
                                              //on redessine la frame
                                              this.repaint();
                                              this.revalidate();
                                          }
                                      }

                                      printStackTrace:

                                      Exception in thread "main" java.lang.Error: Problème de compilation non résolu : 

                                      Erreur de syntaxe sur le sème ";", = attendu

                                      at imagePanel.Fenetre.<init>(Fenetre.java:12)

                                      at imagePanel.MainImage.main(MainImage.java:7)



                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                      Mieux vaut tard que jamais.
                                        20 février 2016 à 23:32:06

                                        aïe, tu fais des bêtises dans ta classe fenêtre. N'ajoute pas ton panel à ta fenetre en dehors du constructeur ou d'une fonction.

                                        Tu dois juste déclarer

                                        private MyImagePanel myImagePanel;


                                        Si tu galères trop, dis le moi que je te fasse un exemple de programme permettant de faire ça!

                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          21 février 2016 à 18:16:47

                                          oui je veux bien car j'y perd mon latin. Ce qui me perturbe, c'set la façon dont tu ajoutes le panel. 

                                          this.add(new MyImagePanel(this.cheminDeLImage), BorderLayout.CENTER);



                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                          Mieux vaut tard que jamais.
                                            21 février 2016 à 18:52:24

                                            Hop!

                                            Dans l'ordre : la frame, le panel et le main.

                                            /*
                                             * To change this license header, choose License Headers in Project Properties.
                                             * To change this template file, choose Tools | Templates
                                             * and open the template in the editor.
                                             */
                                            package testocfilechooser;
                                            
                                            import java.awt.BorderLayout;
                                            import java.awt.Dimension;
                                            import java.awt.event.ActionEvent;
                                            import java.awt.event.ActionListener;
                                            import java.awt.event.WindowAdapter;
                                            import java.awt.event.WindowEvent;
                                            import javax.swing.JButton;
                                            import javax.swing.JFileChooser;
                                            import javax.swing.JFrame;
                                            import javax.swing.JPanel;
                                            
                                            /**
                                             *
                                             * @author Olivier
                                             */
                                            public class MainFrame extends JFrame implements ActionListener {
                                            
                                                //On met le panel central en paramètre pour pouvoir le supprimer après
                                                private MyImagePanel myImagePanel;
                                            
                                                public MainFrame() {
                                            
                                                    this.setLayout(new BorderLayout());
                                            
                                                    JButton jb = new JButton("changer l'image");
                                                    jb.addActionListener(this);
                                                    this.add(jb, BorderLayout.NORTH);
                                            
                                                    this.setPreferredSize(new Dimension(400, 300));
                                                    this.pack();
                                                    this.setVisible(true);
                                                    this.addWindowListener(new WindowAdapter() {
                                                        public void windowClosing(WindowEvent e) {
                                                            System.exit(0);
                                                        }
                                                    });
                                                }
                                            
                                                @Override
                                                public void actionPerformed(ActionEvent e) {
                                                    //Personnellement je trouve plus facile à lire de mettre un seul ActionListener comme ceci à des fins de test. 
                                                    //Néanmoins en réalité il faut faire autrement (un Listener par composant en général
                                            
                                                    JButton src = (JButton) e.getSource();
                                            
                                                    if (src.getText().equals("changer l'image")) {
                                                        //on crée un JFileChooser sur le repertoire courant
                                                        JFileChooser dialogue = new JFileChooser(".");
                                                        
                                                        //on l'affiche
                                                        dialogue.showOpenDialog(null);
                                                        
                                                        //on vérifie qu'on a bien récupéré quelque chose
                                                        String fichierChoisi = dialogue.getSelectedFile() != null ? dialogue.getSelectedFile().getAbsolutePath() : "err";
                                                        
                                                        //si on a bien récupéré quelque chose, on supprime le panel précédent s'il existe, et on affiche un nouveau panel
                                                        if(!fichierChoisi.equals("err")){
                                                            regeneratePanel(new MyImagePanel(fichierChoisi));
                                                        }
                                                    }
                                                }
                                                
                                                private void flush() {
                                                    if (this.myImagePanel != null) {
                                                        this.remove(this.myImagePanel);
                                                        this.myImagePanel = null;
                                                    }
                                                }
                                            
                                                private void regeneratePanel(MyImagePanel jp) {
                                                    flush();
                                                    this.myImagePanel = jp;
                                                    this.add(this.myImagePanel, BorderLayout.CENTER);
                                                    //ici revalidate et repaint sont importants, sinon l'image ne s'affiche que lorsque la fenetre sera redimensionnée
                                                    this.revalidate();
                                                    this.repaint();
                                                    this.pack();
                                                }
                                            
                                            }
                                            

                                            /*
                                             * To change this license header, choose License Headers in Project Properties.
                                             * To change this template file, choose Tools | Templates
                                             * and open the template in the editor.
                                             */
                                            package testocfilechooser;
                                            
                                            import java.awt.Graphics;
                                            import java.awt.image.BufferedImage;
                                            import java.io.File;
                                            import java.io.IOException;
                                            import javax.imageio.ImageIO;
                                            import javax.swing.JPanel;
                                            
                                            /**
                                             *
                                             * @author Olivier
                                             */
                                            public class MyImagePanel extends JPanel{
                                                private String cheminDeLImage;
                                                public MyImagePanel(String cheminDeLImage){
                                                    this.cheminDeLImage = cheminDeLImage;
                                                }
                                                @Override
                                                public void paintComponent(Graphics g){
                                                    try {
                                                        BufferedImage img = ImageIO.read(new File(this.cheminDeLImage));
                                                        g.drawImage(img, 0, 0, this);
                                                    } catch (IOException e) {
                                                        e.printStackTrace();
                                                    }
                                                }
                                                
                                            }
                                            

                                            /*
                                             * To change this license header, choose License Headers in Project Properties.
                                             * To change this template file, choose Tools | Templates
                                             * and open the template in the editor.
                                             */
                                            package testocfilechooser;
                                            
                                            /**
                                             *
                                             * @author Olivier
                                             */
                                            public class TestOCFileChooser {
                                            
                                                /**
                                                 * @param args the command line arguments
                                                 */
                                                public static void main(String[] args) {
                                                    MainFrame mf = new MainFrame();
                                                }
                                                
                                            }
                                            

                                            N'hésite pas à poser des questions si tu le souhaites!
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              21 février 2016 à 21:04:28

                                              C'est un truc de ouf pour moi çà décoiffe. Bon je lirai correctement ton code demain, à tête reposée.

                                              A+.

                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                              Mieux vaut tard que jamais.
                                                22 février 2016 à 20:28:13

                                                Bonjour Triterium,

                                                oui effectivement j'ai plusieurs questions:

                                                1/ pourquoi 2 panel pour ensuite en  supprimer 1 ?

                                                2/ qu'elle est la fonction de flush ?

                                                3/ Que veut dire:

                                                this.cheminDeLImage = cheminDeLImage;


                                                4/ est-ce bien le répertoire courant que tu indique a la fin du JFileChooser (".") ?

                                                Autre chose concernant Eclipse, comment fais-tu pour ouvrir une page de l'éditeur sans pour autant  créer un projet ou une classe ?

                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                Mieux vaut tard que jamais.
                                                  22 février 2016 à 21:09:28

                                                  Alors :

                                                  1/ Comment ça 2 panels?

                                                  2/ flush permet de dégager le panel du centre dans tous les cas : s'il existe il est dégagé, sinon on ne fait rien.

                                                  3/ ça signifie qu'on va passer en paramètre un String qui s'appelle cheminDeLImage et que l'on va attribuer à l'attribut de classe qui s'appelle cheminDeLImage (ligne 20 de MyImagePanel). On utilise this.cheminDeLImage pour signifier qu'on parle de l'attribut de classe cheminDeLImage et non pas du string CheminDeLImage qui est en paramètre du constructeur.

                                                  4/ yes, "." est le répertoire courant.

                                                  Je ne sais pas, j'utilise netbeans ^^

                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    23 février 2016 à 9:36:18

                                                    zatopec a écrit:

                                                    Autre chose concernant Eclipse, comment fais-tu pour ouvrir une page de l'éditeur sans pour autant  créer un projet ou une classe ?


                                                    Qu'appelle-tu page de l’éditeur ?
                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                      23 février 2016 à 18:32:59

                                                      Bonjour Triterium,

                                                      C'est comme si tu crées un projet avec sa classe donc un onglet s'ouvre avec le nom de la classe et là tu peux codé. C'est ouvrir l'éditeur sans projet et sans classe et que tu puisses codé quand même. par exemple tu es dans une discussion et tu veux montrer un bout de code sans pour autant crée de classe, je dirais tu codes à la volée à l'instant "T"et tu le diffuse dans la discussion instantanément. Un peu comme une classe vide. J'espère que tu me comprendras.

                                                      Par contre je n'ai pas compris le panel.

                                                      Puis-je me permettre de rajouter quelques commentaires dans le code ?

                                                      De plus c'est exactement ce que je recherchais pour avancer dans mon projet (1er post) et j'ai aussi acheté le livre d'Anne Tasso "Java premier langage". Connais-tu ce livre?

                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                      Mieux vaut tard que jamais.
                                                        24 février 2016 à 8:52:28

                                                        zatopec a écrit:

                                                        C'est comme si tu crées un projet avec sa classe donc un onglet s'ouvre avec le nom de la classe et là tu peux codé. C'est ouvrir l'éditeur sans projet et sans classe et que tu puisses codé quand même. par exemple tu es dans une discussion et tu veux montrer un bout de code sans pour autant crée de classe, je dirais tu codes à la volée à l'instant "T"et tu le diffuse dans la discussion instantanément. Un peu comme une classe vide. J'espère que tu me comprendras.


                                                        Tres bonne question du coup, mais je pense que ce n'est pas possible x)

                                                        Mais tu peux toujours avoir un projet "BlocNote" avec juste une classe et coder a la va vite dedans pour voir ce qui peut marcher (et avoir une bonne indentation)

                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                          24 février 2016 à 9:20:14

                                                          zatopec a écrit:

                                                          Bonjour Triterium,

                                                          C'est comme si tu crées un projet avec sa classe donc un onglet s'ouvre avec le nom de la classe et là tu peux codé. C'est ouvrir l'éditeur sans projet et sans classe et que tu puisses codé quand même. par exemple tu es dans une discussion et tu veux montrer un bout de code sans pour autant crée de classe, je dirais tu codes à la volée à l'instant "T"et tu le diffuse dans la discussion instantanément. Un peu comme une classe vide. J'espère que tu me comprendras.

                                                          Par contre je n'ai pas compris le panel.

                                                          Puis-je me permettre de rajouter quelques commentaires dans le code ?

                                                          De plus c'est exactement ce que je recherchais pour avancer dans mon projet (1er post) et j'ai aussi acheté le livre d'Anne Tasso "Java premier langage". Connais-tu ce livre?


                                                          Alors pour Eclipse je en sais pas donc je ne pourrais pas te répondre.

                                                          Que n'as-tu pas compris pour le panel? à quoi il sert? son fonctionnement?

                                                          Oui, vas-y comment et reposte!

                                                          • Partager sur Facebook
                                                          • Partager sur Twitter
                                                            24 février 2016 à 18:03:27

                                                            Bonjour Triterium,

                                                            pour le panel, c'est le fait de le mettre en central et de le supprimer, en gros c'est son fonctionnement.

                                                            //On met le panel central en paramètre pour pouvoir le supprimer après
                                                                private MyImagePanel myImagePanel;
                                                              
                                                                        //si on a bien récupéré quelque chose, on supprime le panel précédent s'il existe, et on affiche un nouveau panel
                                                                        if(!fichierChoisi.equals("err")){
                                                                            regeneratePanel(new MyImagePanel(fichierChoisi));

                                                            Je pense que ("err") = erreur ?

                                                            Quant est-ce-que l'on doit mettre "statement" ( });)?

                                                            Bon je commente le code et je reposte pour validation



                                                            • Partager sur Facebook
                                                            • Partager sur Twitter
                                                            Mieux vaut tard que jamais.
                                                              24 février 2016 à 18:38:34

                                                              Voilà le code avec plus de commentaires:

                                                              /*
                                                              de * To change this license header, choose License Headers in Project Properties.
                                                               * To change this template file, choose Tools | Templates
                                                               * and open the template in the editor.
                                                               */
                                                              package testocfilechooser;
                                                               
                                                              import java.awt.BorderLayout;
                                                              import java.awt.Dimension;
                                                              import java.awt.event.ActionEvent;
                                                              import java.awt.event.ActionListener;
                                                              import java.awt.event.WindowAdapter;
                                                              import java.awt.event.WindowEvent;
                                                              import javax.swing.JButton;
                                                              import javax.swing.JFileChooser;
                                                              import javax.swing.JFrame;
                                                               
                                                              /**
                                                               *
                                                               * @author Olivier
                                                               */
                                                              public class MainFrame extends JFrame implements ActionListener {
                                                               
                                                                  /**
                                                              	 * 
                                                              	 */
                                                              	private static final long serialVersionUID = -7979708786705955181L;
                                                              	//On met le panel central en paramètre pour pouvoir le supprimer après.
                                                              	//On passe  en paramètre un String qui s'appelle cheminDeLImage et
                                                              	//que l'on va attribuer à l'attribut de classe.
                                                                  private MyImagePanel myImagePanel;
                                                               
                                                                  public MainFrame() {
                                                               
                                                                      this.setLayout(new BorderLayout());
                                                               
                                                                      JButton jb = new JButton("changer l'image");
                                                                      jb.addActionListener(this);
                                                                      this.add(jb, BorderLayout.NORTH);
                                                               
                                                                      this.setPreferredSize(new Dimension(400, 300));
                                                                      this.pack();
                                                                      this.setVisible(true);
                                                                      this.addWindowListener(new WindowAdapter() {
                                                                          public void windowClosing(WindowEvent e) {
                                                                              System.exit(0);
                                                                          }
                                                                      });
                                                                  }
                                                               
                                                                  @Override
                                                                  public void actionPerformed(ActionEvent e) {
                                                                      //Personnellement je trouve plus facile à lire de mettre un seul ActionListener comme ceci à des fins de test.
                                                                      //Néanmoins en réalité il faut faire autrement (un Listener par composant en général
                                                               
                                                                      JButton src = (JButton) e.getSource();
                                                               
                                                                      if (src.getText().equals("changer l'image")) {
                                                                          //on crée un JFileChooser sur le repertoire courant
                                                                          JFileChooser dialogue = new JFileChooser(".");
                                                                           
                                                                          //on l'affiche
                                                                          dialogue.showOpenDialog(null);
                                                                           
                                                                          //on vérifie qu'on a bien récupéré quelque chose
                                                                          String fichierChoisi = dialogue.getSelectedFile() != null ? dialogue.getSelectedFile().getAbsolutePath() : "err";
                                                                           
                                                                          //si on a bien récupéré quelque chose, on supprime le panel précédent s'il existe et on affiche un nouveau panel
                                                                          if(!fichierChoisi.equals("err")){
                                                                              regeneratePanel(new MyImagePanel(fichierChoisi));
                                                                          }
                                                                      }
                                                                  }
                                                                   // flush(flux)permet de supprimer le panel du centre dans tous les cas : 
                                                                  //s'il existe il est supprimer, sinon on ne fait rien.
                                                                  private void flush() {
                                                                      if (this.myImagePanel != null) {
                                                                          this.remove(this.myImagePanel);
                                                                          this.myImagePanel = null;
                                                                      }
                                                                  }
                                                                  //On régénere le panel
                                                                  private void regeneratePanel(MyImagePanel jp) {
                                                                      flush();
                                                                      this.myImagePanel = jp;
                                                                      this.add(this.myImagePanel, BorderLayout.CENTER);
                                                                      //ici revalidate et repaint sont importants, sinon l'image ne s'affiche que lorsque la fenêtre sera redimensionnée
                                                                      this.revalidate();
                                                                      this.repaint();
                                                                      this.pack();
                                                                  }
                                                               
                                                              }
                                                              
                                                              /*
                                                               * To change this license header, choose License Headers in Project Properties.
                                                               * To change this template file, choose Tools | Templates
                                                               * and open the template in the editor.
                                                               */
                                                              package testocfilechooser;
                                                               
                                                              import java.awt.Graphics;
                                                              import java.awt.image.BufferedImage;
                                                              import java.io.File;
                                                              import java.io.IOException;
                                                              import javax.imageio.ImageIO;
                                                              import javax.swing.JPanel;
                                                               
                                                              /**
                                                               *
                                                               * @author Olivier
                                                               */
                                                              public class MyImagePanel extends JPanel{
                                                                  
                                                              	private static final long serialVersionUID = 1L;
                                                              	
                                                              	private String cheminDeLImage;
                                                                  public MyImagePanel(String cheminDeLImage){
                                                                  	//Signifie qu'on parle de l'attribut de classe cheminDeLImage et 
                                                                  	//Non pas du string CheminDeLImage qui est en paramètre du constructeur. 
                                                                      this.cheminDeLImage = cheminDeLImage;
                                                                  }
                                                                  @Override
                                                                  public void paintComponent(Graphics g){
                                                                      try {
                                                                      	//On stocke dans le tampon  l'image et on la dessine.
                                                                          BufferedImage img = ImageIO.read(new File(this.cheminDeLImage));
                                                                          g.drawImage(img, 0, 0, this);
                                                                      } catch (IOException e) {
                                                                          e.printStackTrace();
                                                                      }
                                                                  }
                                                                   
                                                              }
                                                              

                                                              Au faîte, as-tu une bonne opinion de ce livre?


                                                              • Partager sur Facebook
                                                              • Partager sur Twitter
                                                              Mieux vaut tard que jamais.

                                                              boite de dialogue JFileChooser

                                                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                                              • Editeur
                                                              • Markdown