//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; iu<nu; iu++) e[iu]=u[iu].getAbsolutePath(); } else e=lesRepertoires(rep.getAbsolutePath()); if(e == null) e=lesRepertoires(""+File.separatorChar); lRep.removeAll(); lRep.add(MARGE+"^^ [remontée]"); for(int i=0; i<e.length; i++) lRep.add(MARGE+e[i]); } public static void main(String[] args) { // Répertoire courant, construction et affichage de la fenêtre String rCourant=System.getProperty("user.dir"); ChoixRepertoire fen = new ChoixRepertoire(rCourant); fen.setVisible(true); //2. Des utilisations d'un objet File dans la méthode main ////////////////////////////////////////////////////////// //2.a la racine (le père vaut 'null') File f = new File(""+File.separatorChar); System.out.println("Racine: "+f.getAbsoluteFile()+ "\n parent: "+f.getParent()); //2.b le répertoire courant et son père f = new File(System.getProperty("user.dir")); System.out.println("Rép.courant: "+f.getAbsoluteFile()+ "\n parent: "+f.getParent()); //2.b le répertoire courant, et ses sous-répertoires System.out.println("Rép.courant et ses sous-répertoires"); String e[]=lesRepertoires(rCourant); for(int i=0; i<e.length; i++) if(i%5==4) System.out.println(" '"+e[i]+"'"); else System.out.print(" '"+e[i]+"'"); System.out.println(); //2.c Les différents lecteurs (sous Windows: A:\ C:\ ...) int iu; File u[]=(new File("")).listRoots(); System.out.println("Différents lecteurs: "); for(iu=0; iu<u.length; iu++) System.out.print(" "+u[iu]); System.out.println(); //2.d Répertoires d'un lecteur System.out.println("Sous-répertoire de "+u[0]); System.out.println(" u[0].isDirectory(): "+u[0].isDirectory()); String ru[]=lesRepertoires(u[0]); for(iu=0; iu<ru.length; iu++) System.out.println(" "+ru[iu]); //2.e Un File (fu) à partir de nomL, nom d'un lecteur (exemple C:\) if(u.length>1) 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<entrees.length; i++) if(entrees[i].isDirectory()) nr++; String lesRep[] = new String[nr]; for(i=0, nr=0; i<entrees.length; i++) if(entrees[i].isDirectory()){ lesRep[nr]=entrees[i].getName();nr++; } Arrays.sort(lesRep,0,lesRep.length); return lesRep; } /** Les sous-répertoires de nomRep. * Si unRep n'est pas un sous-répertoire, renvoie null * sinon le tableau renvoyé contient les sous-répertoires */ static public String[] lesRepertoires(String nomRep) { return lesRepertoires(new File(nomRep)); } } // fin class ChoixRepertoire // fin ChoixRepertoire.java