IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Agents de placement/Fenêtres Java Discussion :

[JFileChooser]Sauver un fichier avec extension forcée [FAQ]


Sujet :

Agents de placement/Fenêtres Java

  1. #1
    Membre à l'essai
    Inscrit en
    Octobre 2003
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 25
    Points : 19
    Points
    19
    Par défaut [JFileChooser]Sauver un fichier avec extension forcée
    Bonjour à tous !

    J'ai lu la FAQ et pense avoir parcourut tous les sujets concernants les jFileChooser de ce forum et je me trouve coincé malgré tout.

    En fait, j'arrive à faire un jFileChooser pour ouvrir un fichier avec filtre qui fonctionne correctement (ex : n'affice que les fichiers XML et pointe d'office sur le répertoire de travail attribué). Mon problème est que j'aimerais faire la même chose pour sauvegarder. Visuellement, le jFileChooser créé indique le type de filtre que je désire utiliser (ex : "Fichier XML (*.xml)") mais... je peux donner l'extension que je désire à mon fichier, lorsque je clique sur "Sauver", il n'y a pas d'erreur ni d'exception... :-(

    J'aimerais qu'au moins, il prenne le nom du fichier entré par l'utilisateur (même si celui-ci entre une extension fausse...) et que ça soit concaténé avec l'extension que je désire...

    Voici le code de mon jFileChooser :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    /****************************************************/
    //Cette fonction permet de créer une fenêtre pour sauvegarder
    //un fichier en forcant l'extension et en pointant sur le répertoire
    //de travail courant. Elle retourne un booléen qui indique si un
    //fichier a été choisi ou non.                                                                   /****************************************************/
        public boolean sauverFichier(FiltreExtension filtre, String fileDirectory) {
            boolean new_path = false;
            JFileChooser openFile = new JFileChooser(fileDirectory);
     
            // validation du filtrage à partir des arguments de la fonction
            openFile.setFileFilter(filtre);
            openFile.setAcceptAllFileFilterUsed(false);
     
            // ouvre une fenêtre de dialogue pour sauver un fichier
            sav = openFile.showSaveDialog(null);
     
            // retourne 'faux' s'il n'y a pas eu confirmation de sélection d'un 
            //  fichier et arrete l'exécution de cette fonction
            if (sav != JFileChooser.APPROVE_OPTION) {
                return new_path;
            }
            setPathFile(openFile.getSelectedFile().getAbsoluteFile().
                        getAbsolutePath());
            new_path = true;
            return new_path;
        }
    (sav est un int défini dans ma classe)

    Voici le code de mon filtre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    /****************************************************/
    // Cette classe permet de paramétrer les fenêtres de dialogues
    // pour sauver ou ouvrir un fichier en forcant l'extension
    // (i.e : on ne s'intéresse qu'aux fichiers XML...)                                                                                                                                                                                             
    /****************************************************/
    package parseur;
     
    import java.io.*;
     
    public class FiltreExtension extends javax.swing.filechooser.FileFilter {
            private String description;
            private String[] extensions;
    /*****************************************************/
    // Il y a deux constructeurs : pour filtrer plusieurs types de
    // fichiers ou seul à la fois. Pour le moment, dans le projet, nous
    // ne filtrons qu'un type de fichier à la fois.                                                    
    /*****************************************************/
            public FiltreExtension(String description, String[] extensions){
               super();
               this.description = description;
               this.extensions = (String[]) extensions.clone();
            }
     
            public FiltreExtension(String description, String extension) {
                    this(description,new String[]{extension});
            }
     
    /*****************************************************/
    //Comportement de l'affichage de la boîte de dialogue à laquelle
    // on a associé un filtre                                                                               /*****************************************************/
            public boolean accept(File file) {
                    if(file.isDirectory()) {
                       return true;
                    }
                    String nomFichier = file.getPath().toLowerCase();
                    int n = extensions.length;
                    for(int i=0; i<n; i++) {
                       if(nomFichier.endsWith(extensions[i])) {
                          return true;
                        }
                     }
                     return false;
            }
     
    /*****************************************************/
    // Permet de décrire le type de fichier (ex : "fichier XML (*.xml)"
    /*****************************************************/
            public String getDescription() {
                    return(this.description+" (*"+this.extensions[0]+")");
            }
    }
    [ Modéré par Viena ]
    Ajout d'un tag dans le titre : plus un titre est précis, plus les réponses le sont.

    Les Règles du Forum

  2. #2
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Points : 2 757
    Points
    2 757
    Par défaut
    salut,

    tu peux implémenter une classe dérivant de JFileChooser et surcharger la méthode "void approveSelection() " qui est appelée lorsque l'utilisateur clique sur "Save".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void approveSelection()
    {
     
       // traiter le nom du fichier pour lui mettre la bonne extension
     
       super.approveSelection();
    }
    le problème sera pour l'utilisateur. si tu fais ça alors il pourra tenter de sauvegarder avec une extension exotique et la bonne extension sera mise quand même. mais lui ne le saura pas et il pourrait ne pas retrouver son fichier (ou en tout cas perdre du temps à rechercher le fichier qu'il croit avoir sauvegardé avec une certaine extension)

  3. #3
    Membre à l'essai
    Inscrit en
    Octobre 2003
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 25
    Points : 19
    Points
    19
    Par défaut
    Merci pour ton aide !!! Il me semble que c'est déjà la deuxième fois en deux jours... Merci !! :-)

    Donc, j'ai fait ce que tu m'as conseillé : j'ai fait une classe qui dérive de JFileChooser et j'ai surchargé approveSelection().

    Et... aucun résultat : je ne rentre même pas dans cette fonction en fait...

    Je ne dois pas faire moi-même d'appel à la fonction approveSelection(), si ? Si j'ai bien compris, c'est automatique : dès que l'on appuye sur "OK" pour sauvegarder, approveSelection() est exécuté... non ?

  4. #4
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Points : 2 757
    Points
    2 757
    Par défaut
    re,

    chez moi ça marche

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class MyFileChooser extends JFileChooser
    {
        MyFileChooser()
        {
            super();
        }
     
        @Override public void approveSelection()
        {
            super.approveSelection();
            System.out.print("je passe dans approveSelection()");
        }
    }
    quand je clic sur "Open" (chez moi c'est un Open, mais avec un Save c'est pareil), une image est affichée dans ma dialog (c'est un visualisateur d'images) et le message "je passe dans approveSelection()" est affiché dans le prompt de mon EDI (JBuilder) ce qui prouve que lorsque je clic sur Open je passe dans approveSelection()


  5. #5
    Membre à l'essai
    Inscrit en
    Octobre 2003
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 25
    Points : 19
    Points
    19
    Par défaut


    Je ne connais pas :-( Est-ce que ça provient de jdk 1.5 ? Et qu'est-ce que c'est censé faire ? En tout cas, mon EDI (BlueJ) m'indique une erreur en me signalant : "illegal character : \64"



    En tout cas, si ça provient du JDK, j'utilise la 1.4 et je ne peux pas la changer car je ne peux pas avoir les droits administateur...

  6. #6
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Points : 2 757
    Points
    2 757
    Par défaut
    tu n'es pas obligé de mettre @Override, ça marchera sans (en tout cas chez moi ça marche , fais voir ton code avec la classe qui étends JFileChooser).

    @Override est présent à partir du jdk 1.5 et sert à préciser que la méthode implémentée est une surcharge d'une méthode parent. comme ça si tu te plante dans le type de retour, la signature ou les droits, tu as un message d'erreur te disant que tu t'es planté.

  7. #7
    Membre à l'essai
    Inscrit en
    Octobre 2003
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 25
    Points : 19
    Points
    19
    Par défaut
    Création class et constructeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    public class choixFichier extends JFileChooser {
        private FiltreExtension filtre;
        private boolean save;
        private int sav;
        private String filePath;
     
        public choixFichier() {
            super();
            try {
                jbInit();
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
    Fonction pour créer le JFileChooser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
        public boolean sauverFichier(FiltreExtension filtre, String fileDirectory) {
            boolean new_path = false;
            JFileChooser openFile = new JFileChooser(fileDirectory);
     
            // validation du filtrage à partir des arguments de la fonction
            openFile.setFileFilter(filtre);
            openFile.setAcceptAllFileFilterUsed(false);
     
            // ouvre une fenêtre de dialogue pour sauver un fichier
            sav = openFile.showSaveDialog(null);
     
            // retourne 'faux' s'il n'y a pas eu confirmation de sélection d'un fichier
            // et arrete l'exécution de cette fonction
            if (sav != JFileChooser.APPROVE_OPTION) {
                return new_path;
            }
            setPathFile(openFile.getSelectedFile().getAbsoluteFile().
                        getAbsolutePath());
            new_path = true;
            return new_path;
        }
    La procédure à surcharger :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
        public void approveSelection() {
            System.out.println("BOF !") ;
           // traiter le nom du fichier pour lui mettre la bonne extension 
            String a = this.getSelectedFile().getAbsoluteFile().getAbsolutePath() ;
            System.out.println(a) ;
            setPathDirectory(a);
            super.approveSelection(); 
       }
    Et jamais il n'affiche "BOF"... :-(

  8. #8
    Membre confirmé Avatar de benratti
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    471
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2004
    Messages : 471
    Points : 649
    Points
    649
    Par défaut
    Il y a un truc que je trouve bizarre, tu crees bien une nouvelle classe qui herite de JFileChooser et qui surcharge la methode approveSelection ... mais dans ta fonction qui fait appele a ta fonction de selection, tu fais encore appele a un JFileChooser et non a un objet choixFichier.

    Je me plante peut-etre, mais si tu ne fais pas appele a ta classe choixFichier, c'est normal de ne pas rentrer dans une de ses methodes...

  9. #9
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Points : 2 757
    Points
    2 757
    Par défaut
    +1

    tu n'utilises pas d'objet choixFichier dans ton code! mais toujours un JFileChooser

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    JFileChooser openFile = new JFileChooser(fileDirectory);

  10. #10
    Membre à l'essai
    Inscrit en
    Octobre 2003
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 25
    Points : 19
    Points
    19
    Par défaut
    Voici comment j'ai fait alors !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
     
    import javax.swing.JFileChooser;
    import java.io.File;
     
    public class SauveFichier extends JFileChooser {
        private String finalPath;
        private String finalName;
        private FiltreExtension filtre;
     
        public SauveFichier() {
     
        }
     
        public boolean sauverFichier(FiltreExtension filtre, String fileDirectory) {
            int sav;
            this.filtre = filtre;
            File dir = new File(fileDirectory);
            setCurrentDirectory(dir);
            setFileFilter(filtre);
            setAcceptAllFileFilterUsed(false);
            sav = showSaveDialog(null);
            if (sav != JFileChooser.APPROVE_OPTION) {
                return false;
            }
            return true;
        }
     
        public void approveSelection() {
            setFinalFilePath(getSelectedFile().getAbsoluteFile().getParent());
            setFinalFileName(getSelectedFile().getAbsoluteFile().getName() +
                             filtre.getExtension());
            super.approveSelection();
        }
     
     
        private void setFinalFilePath(String directory) {
            finalPath = directory;
        }
     
        public String getFinalFilePath() {
            return finalPath;
        }
     
        private void setFinalFileName(String directory) {
            finalName = directory;
        }
     
        public String getFinalFileName() {
            return finalName;
        }
    }

  11. #11
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Points : 2 757
    Points
    2 757
    Par défaut
    Salut,

    je pense qu'il est préférable d'appeler le constructeur de la classe mère dans ton constructeur par défaut. sinon je ne suis pas certain que tu construises correctement un JFileChooser :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public SauveFichier()
    {
       super();
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 11
    Dernier message: 17/01/2010, 14h10
  2. Réponses: 8
    Dernier message: 23/03/2009, 14h51
  3. Fichiers avec extension "phps"
    Par Jcpan dans le forum Langage
    Réponses: 8
    Dernier message: 25/02/2009, 09h24
  4. Renomer plusieurs fichiers avec extension précise
    Par nekcorp dans le forum Scripts/Batch
    Réponses: 7
    Dernier message: 12/10/2008, 06h36
  5. Réponses: 9
    Dernier message: 29/10/2005, 20h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo