JFileChooser

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Le composant JFileChooser permet de sélectionner un ou plusieurs fichiers.

 

Utilisation simple

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

·        acceptAllFileFiltersUsed : mis à true pour accepter tous les fichiers.

·        approveButtonText : le texte du bouton OK.

·        controlButtonAreShown : true si les boutons OK et cancel sont visibles.

·        currentDirectory : le répertoire courant.

·        multiSeclectionEnabled : true si on autorise la sélection de plusieurs fichiers.

·       

 

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

·        int showDialog(Component parent, String approveButtonText)           ouvre une boîte de dialogue avec le texte du bouton d’acquiescement.

·        int showOpenDialog(Component parent)          ouvre une boîte de dialogue d’ouverture de fichier.

·        int showSaveDialog(Component parent)           ouvre une boîte de dialogue de sauvegarde de fichier.

·         

Pour sélectionner un fichier : 

 

    JFileChooser choix = new JFileChooser();

    int retour = choix.showOpenDialog(parent);

    if(retour == JFileChooser.APPROVE_OPTION) {

       // un fichier a été choisi ( sortie par OK)

       choix.getSelectedFile().getName());       // nom du fichier

                                                 // choisi

       choix.getSelectedFile().getAbsolutePath();// chemin absolu du

                                                 // fichier choisi

 

    } else ; // pas de fichier choisi

 

ou si on autorise la sélection de plusieurs fichiers : 

 

    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)

             fs[i].getName());        // nom du fichier

                                      // choisi

             fs[i].getAbsolutePath(); // chemin absolu du

                                      // fichier choisi

 

    } else ; // pas de fichier choisi

 

 

Utilisation 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 :

 

import java.io.File;

import javax.swing.*;

import javax.swing.filechooser.*;

 

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;

   }

}

 

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 : 

 

choix. addChoosableFileFilter(mft);

choix. addChoosableFileFilter(mfi);

 

 

public void addChoosableFileFilter(FileFilter filter)

Ajoute un filtre à la liste des filtres

public boolean removeChoosableFileFilter(FileFilter f)

Enlève un filtre de la liste des filtre et renvoie true si le filtre a été enlevé

 public void resetChoosableFileFilters()

Enlève tous les filtres ajoutés : seul reste le filtre AcceptAll s’il est positionné à true

 

 

Utilisation avec FileView

 

La classe abstraite FileView peut être dérivée pour personnaliser les icônes et les descriptions des fichiers.

 

Exemple d’utilisation : 

 

public class MonFileView extends FileView {

    private Hashtable icones = new Hashtable(5);

    private Hashtable fileDescriptions = new Hashtable(5);

    private Hashtable typeDescriptions = new Hashtable(5);

 

    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(String 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

              if(icon==null) icon = (Icon) icones.get("autres");

           }

      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;

    };

 

}

 

Utilisation 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;

      JApplet lApplet;

 

      // pour les *.txt

      JScrollPane jsp = new JScrollPane();

      JEditorPane txt = new JEditorPane();

 

      // pour les *.au

      JButton jouer = new JButton("jouer");

      JButton arreter = new JButton("arreter");

      AudioClip  au = null;

 

 

      public FilePreviewer(JFileChooser fc, JApplet ja) {

        lApplet = ja;

        setPreferredSize(new Dimension(200, 200));

        fc.addPropertyChangeListener(this);

        jsp.getViewport().add(txt, null);

        jsp.setBounds(10,10,180,180);

 

        jouer.setBounds(10,10,70,30);

        arreter.setBounds(90, 10, 80, 30);

        arreter.setEnabled(false);

        jouer.addActionListener(new java.awt.event.ActionListener() {

                 public void actionPerformed(ActionEvent e) {

                   jouer_actionPerformed(e);

                 }

        });

        arreter.addActionListener(new java.awt.event.ActionListener()

        {

                 public void actionPerformed(ActionEvent e) {

                   arreter_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(isShowing()) {

                  loadImage();

                  repaint();

            }

          }

      }

 

      public void paint(Graphics g) {

          if(image == null) {

            loadImage();

          }

          if(image != null) {

                // fichier *.txt

                this.removeAll();

                if ( image.getIconWidth()==-1 &&

                     f.getName().endsWith(".txt")){

                   try{

                      txt.setPage("file:///"+f.getAbsolutePath());

                   }catch(IOException ioe){                    }

                   add(jsp);

                   jsp.repaint();

                }else // les fichiers audio *.au

                if ( image.getIconWidth()==-1 &&

                     f.getName().endsWith(".au")){

                    add(jouer);

                    add(arreter);

                    jouer.repaint();arreter.repaint();

                }

                else{

                   // 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) {

     try{

          URL  u = new URL("file:///"+f.getAbsolutePath());

          au = lApplet.newAudioClip(u);

          au.play();

          jouer.setEnabled(false );

          arreter.setEnabled(true);

     }catch(IOException uke){}

  }

 

  void arreter_actionPerformed(ActionEvent e) {

     if(au!=null) {

         au.stop();

         au = null;

         jouer.setEnabled(true);

         arreter.setEnabled(false);

     }

 

  }

}

 

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

 

    previewer = new FilePreviewer(choixF, this);

    choixF.setAccessory(previewer);

 

Utilisation de FileSystemView