précédent | suivant | table des matières
|
Le composant JFileChooser permet de sélectionner un ou plusieurs fichiers à partir du système de gestion de fichiers.
Utilisation 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. |
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 : |
|
||||
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;
}
} |
Utilisation 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 .... |
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; 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);
Utilisation de FileSystemView
La classe FileSystemView rend les services suivants :
On récupère une instance de FileSystemView par la méthode de classe getFileSystemView().