//
Choix d'un répertoire en Java
/* ChoixRepertoire.java Choix d'un répertoire
1. Construction d'une fenêtre permettant le parcours d'une
arborescence de répertoires.
2. Des utilisations d'un objet File dans la méthode main
3. Voir les méthodes lesRepertoires (après le main) qui fournissent
les sous-répertoires d'un répertoire donné.
Analogue à la méthode listFiles() de la classe File.
*/
import java.awt.event.*;
import java.awt.*;
import java.io.*;
import java.util.Arrays;
public class ChoixRepertoire extends Frame
implements ActionListener, ItemListener {
static final String DEBTITRE="Répertoire ";
static final String MARGE=" ";
String repCourant;
File fRepCourant; boolean lecteur;
TextField tChoix;
Button choisir,annuler;
List lRep;
public ChoixRepertoire(String r) {
repCourant=r;
fRepCourant = new File(r);
lecteur = false;
if(!fRepCourant.isDirectory()) {
repCourant=""+File.separatorChar;
fRepCourant=new File(""+File.separatorChar);
}
try {
Panel p = dessineFen(r);
this.setTitle(DEBTITRE+repCourant);
this.add(p);
this.pack(); // this.setSize(260,340);
this.setLocation(80,80);
}
catch (Exception e) { e.printStackTrace(); }
}
//1. Construction d'une fenêtre permettant le parcours d'une
// arborescence de répertoires.
////////////////////////////////////////////////////////////
private Panel dessineFen(String r) throws Exception {
Font f14 = new Font("Serif",Font.BOLD,14);
// En haut le nom du répertoire sélectionné
Panel pHaut = new Panel(new FlowLayout(FlowLayout.LEFT));
tChoix = new TextField(21);
tChoix.setFont(f14);
tChoix.setForeground(Color.blue);
tChoix.setEnabled(false);
pHaut.add(new Label("Choix:")); pHaut.add(tChoix);
// Au centre une liste de sous-répertoires
lRep = new List(17);
lRep.setFont(new Font("Dialog",Font.BOLD,12));
lRep.setBackground(Color.lightGray);
this.initListeRep(fRepCourant);
// Panneau du bas avec deux boutons côte à côte
Panel pBas = new Panel();
choisir = new Button("Choisir");
choisir.setFont(f14);
annuler = new Button("Annuler");
pBas.add(choisir); pBas.add(annuler);
// Titre et géomètre du panneau principal
Panel pTout=new Panel(new BorderLayout());
pTout.add(pHaut,BorderLayout.NORTH);
pTout.add(lRep,BorderLayout.CENTER);
pTout.add(pBas,BorderLayout.SOUTH);
// Pour quitter par l'encadrement (gestionnaire de fenêtres)
WindowAdapter pf = new WindowAdapter() {
public void windowClosing(WindowEvent e) {
quitterFen(null);
};
};
this.addWindowListener(pf);
annuler.addActionListener(this);
choisir.addActionListener(this);
lRep.addItemListener(this);
lRep.addActionListener(this);
return pTout;
}
/** Surveille, si nécessaire, la fermeture de la fenêtre
(adapter suivant les besoins)
*/
private void quitterFen(String r) {
repCourant=r;
System.out.println("quitterFen, choix: "+repCourant);
System.exit(0);
}
public void actionPerformed(ActionEvent e) {
if(e.getSource()==annuler) quitterFen(null);
else if(e.getSource()==choisir) {
// Quitter avec choix
int idx = lRep.getSelectedIndex();
if(idx<=0) return;
String nom=lRep.getSelectedItem().substring(MARGE.length());
if(!lecteur) {
if(repCourant.endsWith(""+File.separatorChar))
nom=repCourant+nom;
else nom = repCourant+File.separatorChar+nom;
}
quitterFen(nom);
}
else if (e.getSource()==lRep) {
// Changer de répertoire
changeRep(lRep.getSelectedIndex());
}
}
public void itemStateChanged(ItemEvent e) {
int idx = lRep.getSelectedIndex();
if(idx <= 0) changeRep(idx);
else {
String nom=lRep.getSelectedItem().substring(MARGE.length());
tChoix.setText(nom);
}
}
// Changement de répertoire:
// mettre à jour la liste
// effacer le choix précédent
private void changeRep(int idx) {
if(idx < 0) return;
tChoix.setText("");
if(idx == 0) { // remontée
if(fRepCourant==null) {
lRep.deselect(0);
return; // on est à la racine
}
File f = fRepCourant.getParentFile();
if(f == null) {
if(lecteur) return; // on était à la racine
else lecteur=true; // remontée niveau lecteur
}
fRepCourant=f;
}
else {
String nom=lRep.getSelectedItem().substring(MARGE.length());
fRepCourant=new File(fRepCourant,nom);
lecteur=false;
}
initListeRep(fRepCourant);
if(lecteur) repCourant="";
else repCourant=fRepCourant.getAbsolutePath();
this.setTitle(DEBTITRE+repCourant);
// System.out.println("itemStateChanged: "+repCourant);
}
public void actionPerformed1(ActionEvent e) {
if(e.getSource()==annuler) quitterFen(null);
else if(e.getSource()==choisir) {
// Quitter avec choix
int idx = lRep.getSelectedIndex();
if(idx<=0) return;
String nom=lRep.getSelectedItem().substring(MARGE.length());
if(!lecteur) nom=repCourant+File.separatorChar;
quitterFen(nom);
}
else if (e.getSource()==lRep) {
// Changer de répertoire
int idx = lRep.getSelectedIndex();
if(idx < 0) return;
tChoix.setText("");
if(idx == 0) { // remontée
File f = fRepCourant.getParentFile();
if(f == null) { return; } // on était à la racine
fRepCourant=f;
}
else {
String nom=lRep.getSelectedItem().substring(MARGE.length());
fRepCourant=new File(fRepCourant,nom);
}
initListeRep(fRepCourant);
repCourant=fRepCourant.getAbsolutePath();
this.setTitle(DEBTITRE+repCourant);
}
}
public void itemStateChanged1(ItemEvent e) {
int idx = lRep.getSelectedIndex();
if(idx < 0) return;
tChoix.setText("");
if(idx == 0) { // remontée
File f = fRepCourant.getParentFile();
if(f == null) return; // on était à la racine
fRepCourant=f;
initListeRep(fRepCourant);
repCourant=fRepCourant.getAbsolutePath();
this.setTitle(DEBTITRE+repCourant);
}
else {
String nom=lRep.getSelectedItem().substring(MARGE.length());
tChoix.setText(nom);
}
// System.out.println("itemStateChanged: "+repCourant);
}
// Si rep est vide, on est au niveau lectuer
private void initListeRep(File rep) {
String e[] = null;
if(lecteur && rep==null) {
// Les lecteurs
File u[]=(new File("")).listRoots();
if(u == null) return;
int nu=u.length;
if(nu == 0) return;
e=new String[nu];
for(int iu=0; iu1) iu=0; else iu=0;
String nomL=u[iu].getAbsolutePath();
File fu=new File(nomL);
File tfu[] = fu.listFiles();
if(tfu != null) System.out.println("lecteur "+iu+": "+
tfu.length+" fichers");
else System.out.println("lecteur "+iu+" non accessible ");
}
//3. Les méthodes lesRepertoires fournissent les sous-répertoires
/////////////////////////////////////////////////////////////////
/** Les sous-répertoires de fRep.
* Si fRep n'est pas un sous-répertoire, renvoie null
* sinon le tableau renvoyé contient les sous-répertoires
*/
static public String[] lesRepertoires(File fRep) {
if(fRep==null) return null;
File entrees[]=fRep.listFiles();
if(entrees==null) return new String[0];
int i,nr=0;
for(i=0; i