Le composant JFileChooser permet de sélectionner un ou plusieurs fichiers.
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
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 |
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;
};
}
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);