précédent | suivant | table des matières

JFileChooser

Sommaire
  1. utilisation simple
  2. utilisation avec filtre
  3. utilisation avec FileView
  4. utilisation avec accessoires
  5. utilisation de FileSystemView

(Démonstration)

Le composant JFileChooser permet de sélectionner un ou plusieurs fichiers à partir du système de gestion de fichiers.

1Utilisation simple

Déposer le composant sur interface utilisateur, puis le configurer.

La création d'une instance de JFileChooser peut parfois être très longue sous Windows : ceci est du à la présence de fichiers .zip sur le bureau, et, par défaut, Windows traite les fichiers zip comme des répertoires. Pour éviter ce problème deux solutions :

Pour utiliser le composant, on l’active à l’aide d’une des méthodes : 


Pour sélectionner un fichier : 

Un seul fichier Un ou plusieurs fichiers
JFileChooser choix = new JFileChooser();
int retour=choix.showOpenDialog(parent);
if(retour==JFileChooser.APPROVE_OPTION){
   // un fichier a été choisi (sortie par OK)
   // nom du fichier  choisi 
   choix.getSelectedFile().getName());
   // chemin absolu du fichier choisi
   choix.getSelectedFile().
          getAbsolutePath();
}else ... ;// pas de fichier choisi
JFileChooser choix = new JFileChooser();
choix.setMultiSelectionEnabled(true) ;
int retour = choix.showOpenDialog(parent);
if(retour == JFileChooser.APPROVE_OPTION){
   // des fichiers ont été choisis 
   // (sortie par OK)
   File[] fs=choixF.getSelectedFiles();
   for( int i = 1; i<fs.length; ++i){ 
      // nom du fichier 
      fs[i].getName());  
      // chemin absolu du fichier
      fs[i].getAbsolutePath();
   }
}else ... ; // pas de fichier choisi
setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES); permet de sélectionner les fichiers et les répertoires.
setFileSelectionMode(JFileChooser.FILES_ONLY); permet de ne sélectionner que les fichiers.
setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); permet de ne sélectionner que les répertoires.

2Utilisation avec filtre

Les filtres permettent de ne visualiser que certains fichiers en fonction de leurs suffixes. Il faut d’abord créer ces filtres, puis les ajouter au JFileChooser.

Création d’une classe MonFiltre dérivée de la classe abstraite  javax.swing.filechooser.FileFilter :
Puis on crée des instances de ces classes : 
MonFiltre mft = new MonFiltre( 
   new String[]{"txt"},
   "les fichiers texte (*.txt)");
MonFiltre mfi = new MonFiltre( 
   new String[]{"gif","tif", jpeg",
                      "jpg", tiff"},
   "les fichiers image (*.gif, *.tif,
                      *.jpeg)");
Et on les ajoute au dialogue choix de fichier : 
JFileChooser choix = new JFileChooser();
choix.addChoosableFileFilter(mft);
choix.addChoosableFileFilter(mfi);
public class MonFiltre extends FileFilter {
   String [] lesSuffixes;
   String  laDescription;
   public MonFiltre(String []lesSuffixes, 
                         String laDescription){
      this.lesSuffixes = lesSuffixes;
      this.laDescription = laDescription;
   }
   boolean appartient( String suffixe ){
      for( int i = 0; i<lesSuffixes.length; ++i)
         if(suffixe.equals(lesSuffixes[i]))
            return true;
         return false;
   }
   public boolean accept(File f) {
      if (f.isDirectory())  return true;
      String suffixe = null;
      String s = f.getName();
      int i = s.lastIndexOf('.');
      if(i > 0 &&  i < s.length() - 1)
         suffixe=s.substring(i+1).toLowerCase();
      return suffixe!=null&&appartient(suffixe);
   }
   // la description du filtre
   public String getDescription() {
      return laDescription;
   }
}

3Utilisation avec FileView

La classe abstraite FileView peut être dérivée pour personnaliser les icônes et les descriptions des fichiers.  (seules les icônes seraient prises en compte pour l'instant !)

Exemple d’utilisation : 

Création d'une classe dérivée de FileView  Utilisation de cette classe
public class MonFileView extends FileView {
   private HashMap icones = new Hashtable();
   private HashMap fileDescriptions = 
     new HashMap();
   private HashMap typeDescriptions = 
     new HashMap();
   public String getName(File f) { 
      return null
  }
  // description de fichier 
  public void putDescription(File f, 
                 String fileDescription){
    fileDescriptions.put(fileDescription, f);
  }
  public String getDescription(File f) { 
     return (String) fileDescriptions.get(f); 
  }; 
  // description de type de fichier 
  public void putTypeDescription(
        String extension,
	    String typeDescription){ 
     typeDescriptions.put(typeDescription,
                    extension); 
  }
  public void putTypeDescription(File f, 
      String typeDescription){
    putTypeDescription(getExtension(f),
                       typeDescription); 
  }
  public String getTypeDescription(File f){
      return (String)typeDescriptions.get(
                 getExtension(f)); 
  }
  // les icones  
  public String getExtension(File f){ 
     String name = f.getName(); 
     if(name != null) {
        int extensionIndex = 
	    name.lastIndexOf('.'); 
        if(extensionIndex < 0) 
	      return null;
        return 
          name.substring(extensionIndex+1).
               toLowerCase(); 
     } 
     return null;
  }
  public void putIcon(S
         tring extension, Icon icon){ 
     icones.put(extension, icon); 
  } 
  public Icon getIcon(File f) {
     Icon icon = null;
     String extension = getExtension(f); 
     // les répertoires qui
     // ne sont pas des lecteurs
     if(f.isDirectory() && 
           ! f.toString().endsWith(":\\")){ 
        icon = (Icon) icones.get("dir"); 
     }else if(extension != null){
       // les fichiers images
       icon=(Icon)icones.get(extension); 
       // les autres fichiers
     }
     return icon;
   }
   
   public Boolean isHidden(File f) {
      String name = f.getName(); 
      if(name!=null && !name.equals("") && 
            name.charAt(0) == '.')
         return Boolean.TRUE; 
      else return Boolean.FALSE; 
   }
   public Boolean isTraversable(File f) { 
      if(f.isDirectory()) 
	   return Boolean.TRUE; 
      else return Boolean.FALSE;
   }
}
ImageIcon gif = new ImageIcon(
  MonFileView.class.getResource("gif.gif"));
ImageIcon txt = newImageIcon(
MonFileView.class.getResource("txt.gif"));
ImageIcon java = new ImageIcon(
MonFileView.class.getResource("java.gif"));
ImageIcon classe = new ImageIcon(
MonFileView.class.getResource("class.gif"));
ImageIcon pdf = new ImageIcon(
MonFileView.class.getResource("pdf.gif"));
ImageIcon dir = new ImageIcon(
MonFileView.class.getResource("dir.gif"));
ImageIcon autres = new ImageIcon(
MonFileView.class.getResource("autre.gif"));

MonFileView fv = new MonFileView();
fv.putIcon("gif", gif);
fv1.putIcon("txt", txt);
fv.putIcon("java", java);
fv1.putIcon("class", classe);
fv.putIcon("pdf", pdf);
fv1.putIcon("dir", dir);
fv.putIcon("autres", autres);
fv.putTypeDescription("pdf",
     " ça c'est du Portable"+ 
     "Document Format de Adobe Systems");
fv.putTypeDescription("gif",
     " ça c'est du Graphics Interchange"+ 
     " Format de CompuServe");

JFileChooser jfc = new JFileChooser();
jfc.setFileView(fv);
if(jfc.showSaveDialog(this)
    == JFileChooser.APPROVE_OPTION)
   ...
else ....

4Utilisation d’accessoires

La propriété accessory permet d’attacher un composant au dialogue de choix de fichier. On peut utiliser cette possibilité pour ajouter un visualisateur de fichiers image, de fichiers texte, ou un joueur de son …

On commence par définir une classe qui sera le composant affiché : cette classe doit implémenter l’interface PropertyChangeListener, pour pouvoir répondre aux événements PropertyChange de la classe JFileChooser.

class FilePreviewer extends JComponent implements PropertyChangeListener {
   // pour les images
   ImageIcon image = null;
   File f = null;
   JFrame lAppli;
   // pour les *.txt et les *.html
   JEditorPane txt = new JEditorPane();
   // pour les *.au, et les *.wav
   JButton jouer = new JButton();
   AudioClip au = null;
   // pour les autres fichiers 
   JLabel message1 = new JLabel();
   JLabel message2 = new JLabel();
   public FilePreviewer(JFileChooser fc, JFrame ja) {
      lAppli = ja;
      setPreferredSize(new Dimension(200, 200));
      fc.addPropertyChangeListener(this);
      txt.setBounds(0,0,200,200);    
      Font f = new Font("Comic sans ms", Font.BOLD, 14);
      message1.setBounds(0, 70, 200, 30);
      message1.setFont(f);
      message1.setForeground(Color.RED);
      message1.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
      message2.setBounds(0, 100, 200, 30);
      message2.setFont(f);
      message2.setForeground(Color.RED);
      message2.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
      jouer.setBounds(65, 83, 70, 35);
      jouer.setToolTipText("Joue le son choisi !");
      jouer.setIcon(new ImageIcon(lAppli.getClass().getResource("son.gif")));
      jouer.addActionListener(new java.awt.event.ActionListener() {
          public void actionPerformed(ActionEvent e) {
              jouer_actionPerformed(e);
          }
      });
   }
   
   public void loadImage() {
      if (f != null) {
         ImageIcon tmpIcon = new ImageIcon(f.getPath());<
         if (tmpIcon.getIconWidth() > 190) {
            image = new ImageIcon(tmpIcon.getImage().getScaledInstance(190,
			-1, Image.SCALE_DEFAULT));
         }else image = tmpIcon;
      }
   }
   public void propertyChange(PropertyChangeEvent e) {
      String prop = e.getPropertyName();
      if (prop == JFileChooser.SELECTED_FILE_CHANGED_PROPERTY) {
         f = (File) e.getNewValue();
         if(f==null)return;
         if (isShowing()) {
            loadImage();
            removeAll();
            if (image == null) {
               loadImage();
            }
            if (image != null) {
               if(f==null) return;
               // fichiers *.txt ou *.html
               if (image.getIconWidth() == -1 && (  f.getName().endsWith(".txt")
                         ||f.getName().endsWith(".html"))) {
                  try {
                     txt.setPage("file:///" + f.getAbsolutePath());
                     add(txt);
                  } catch (IOException ioe) {
                      System.out.println(ioe);
                  }
               }else // les fichiers audio *.au ou wav
                  if (image.getIconWidth() == -1 && ( f.getName().endsWith(".au")||
                            f.getName().endsWith(".wav"))) {
                     add(jouer);   
                  }else{
                     if(image.getIconWidth()==-1){
                        // suffixe non traité ... 
                        String suff = f.getName().substring(f.getName().lastIndexOf(".")+1);
                        message1.setText("pas de visu ! pour le" );
                        add(message1);
                        message2.setText("suffixe : "+suff);
                        add(message2);
                     }
                  }
            }
            repaint();
         }
      }
   }
   public void paint(Graphics g) {
      super.paint(g);
      loadImage();
      if (image != null) {
         if (image.getIconWidth()!=-1){
            // les fichiers images
            int x = getWidth() / 2 - image.getIconWidth() / 2;
            int y = getHeight() / 2 - image.getIconHeight() / 2;
            if (y < 0) y = 0;
            if (x < 5) x = 5;
            image.paintIcon(this, g, x, y);
         }
      }
   }
   void jouer_actionPerformed(ActionEvent e){
      // jouer le son d'un fichier
      try {
         URL u = new URL("file:///" + f.getAbsolutePath());
         AudioClip ac = Applet.newAudioClip(u);
         ac.play();
      }catch(MalformedURLException e1) { ... }
   }
}

On peut alors greffer le visualisateur dans le dialogue choix de fichier : 

previewer = new FilePreviewer(choixF, this);
choixF.setAccessory(previewer);

5Utilisation de FileSystemView

La classe FileSystemView rend les services suivants :

On récupère une instance de FileSystemView par la méthode de classe getFileSystemView().

haut de la page