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 sans JFrame - Receuillir les path et nom du fichier sélectionné


Sujet :

Agents de placement/Fenêtres Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    263
    Détails du profil
    Informations personnelles :
    Âge : 73
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 263
    Points : 121
    Points
    121
    Par défaut JFileChooser sans JFrame - Receuillir les path et nom du fichier sélectionné
    J'ai créé un JPanel dont les composants sont disposés suivant un GroupLayout. Dans une case de celui-ci, j'ai placé un objet de type 'JFileChooser', mais à demeure (= cas B). Il n'y a donc pas de frame pop-up de fileChooser (= cas A), qui n'apparaîtrait que lorsqu'un composant déterminé de GUI dans le GroupLayout est actionné. Il n'y a donc pas de composant parent. Je voudrais qu'en actionnant le bouton 'Open', la chaîne de caractères du path et fichier choisi soit transmise à la partie logique de ma classe contenant ce GUI, plutôt que d'ouvrir le fichier sélectionné.

    J'ai lu le document http://docs.oracle.com/javase/tutori...lechooser.html
    Dans le paragraphe suivant, j'expose ce que je comprends de la mise en oeuvre d'un 'Action Listener', de sa méthode 'ActionPerformed()' ...
    - pour le cas A (pop-up frame. 2 classes : Une pour la frame pop-up de choix de fichier et une autre pour l'objet faisant appel à cette frame)
    - et pour le cas B (fileChooser à demeure. Classe unique).
    Q1: Quelles erreurs de raisonnement commettrais-je ?

    1. Declare an event handler class and specify that the class either implements an ActionListener interface or extends a class that implements an ActionListener interface. For example: public class MyClass implements ActionListener {
    Cas A: 'implements ActionListener' est à ajouter à la déclaration de la classe d'où part l'appel de la frame de choix de fichier et qui habrite le code 'event handler'
    Cas B: J'ai ajouté 'implements ActionListener' à ma classe :
    'public class FichierDonnéesDEntrée extends JPanel implements ActionListener'

    2. Register an instance of the event handler class as a listener on one or more components. For example: someComponent.addActionListener(instanceOfMyClass);
    Cas A: La classe du 'JFileChooser', qui possède deux Jbutton's ('Open' et 'Cancel'), a pour chacun de ces boutons qqch comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    openButton.addActionListener(instanceDeMaClasseQuiAppeleLaFrameChoixDeFichier);
    Cas B:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fileChooser.openButton.addActionListener(this);
    ne fonctionne pas. 'fileChooser.openButton est erroné et je devrais pouvoir adresser la méthode 'addActionListener()' de fileChooser. Q2: Comment arriver à joindre mon 'ActionListener' et ma fonction 'actionPerformed()' à openButton de mon fileChooser ? C'est la question principale de la présente discussion.

    3. Include code that implements the methods in listener interface. For example:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public void actionPerformed(ActionEvent e) 
    {   ...//code that reacts to the action... 
    }
    Cas A: Code situé dans la classe d'où part l'appel de la frame de choix de fichier , qui habrite le code 'event handler' et à laquelle on a ajouté 'implements ActionListener'.
    Cas B: Idem. J'ai implémenté la fonction 'actionPerformed(ActionEvent e)' dans ma classe comportant le GroupLayout et donc fileChooser.

    Je constate que je ne peux pas employer 'int returnVal = fileChooser.showOpenDialog(this);'.

    '== fileChooser.openButton)' est la seule mention d'erreur que le compilateur persiste à relever : Il ne trouve pas l'objet openButton (devant pourtant exister dans 'fileChooser'). 'private' ?

    Au lieu d'ouvrir le fichier sélectionné, mon application requière d'appeller une fonction - populateTable(String pathNomFichier). Un fichier de type propriétaire (CsvFile) est alors créé et les données figurant initialement dans le tableau seront ainsi remplacées par celles du fichier sélectionné.

    P.S.: Je dois aussi encore trouver comment effacer tout le contenu d'un tableau existant (MonModèleDeTable) et le remplacer par un nouveau contenu, sans relancer le constructeur MonModèleDeTable.

    Merci aux âmes compatissantes ...
    "Ah oui ! Juste encore cette toute dernière petite question ..." (Columbo - Peter Falk)

  2. #2
    Membre expérimenté Avatar de Nico02
    Homme Profil pro
    Developpeur Java/JEE
    Inscrit en
    Février 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Developpeur Java/JEE
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 728
    Points : 1 622
    Points
    1 622
    Par défaut
    Bon, de ce que j'ai compris..

    Lorsque tu clique sur un de tes composant, le JFileChooser s'affiche, et tu veux exploiter le fichier sélectionner pour remplir une JTable ?

    Pour cela, tu commence par ajouter un ActionListener sur le composant en question (dans mon exemple ce sera un bouton )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    JButton bouton = new JButton();
    jButton.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent evt) {      
    		int returnVal = monFileChooser.showOpenDialog(this);
     
    		if (returnVal == JFileChooser.APPROVE_OPTION) {
                      File file = monFileChooser.getSelectedFile();
                      // Ici tu fais appel à une fonction qui va traiter ton fichier et remplir ta table
                      maFonction(file);
                    }
            }
        });
    Après tu n'a plus qu'a traiter ton fichier comme tu le souhaite.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    263
    Détails du profil
    Informations personnelles :
    Âge : 73
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 263
    Points : 121
    Points
    121
    Par défaut
    Merci, Nico02, pour ton essai de réponse.

    Que le fileChooser soit implémenté en permanence dans une case de mon GroupLayout ou qu'il fasse partie d'une fenêtre pop-up ne change rien à la technique d'interception de l'actionnement de l'un de ses boutons.

    C'est
    e.getSource() == openButton
    qui ne marche pas.
    Comment atteindre en particulier le bouton 'openButton' du fileChooser ? Pour lui associer un "addActionListener(new ActionListener() {...", notamment à partir de la classe comportant mon GroupLayout.
    "Ah oui ! Juste encore cette toute dernière petite question ..." (Columbo - Peter Falk)

  4. #4
    Membre expérimenté Avatar de Nico02
    Homme Profil pro
    Developpeur Java/JEE
    Inscrit en
    Février 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Developpeur Java/JEE
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 728
    Points : 1 622
    Points
    1 622
    Par défaut
    Désolé mais je ne comprends pas ce que tu cherches à faire. Pourquoi essayer d'ajouter un ActionListener sur le bouton de la fenêtre interne du JFileChooser ?

    Peux tu nous dire exactement ce que tu cherche à faire ? Car à mon avis tu mélanges un peu tout.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    263
    Détails du profil
    Informations personnelles :
    Âge : 73
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 263
    Points : 121
    Points
    121
    Par défaut
    Merci pour ta patiente, Nico02

    Le but que je voudrais atteindre :
    - Afficher le fileChooser dans une place fixe du GroupLayout d'un JPanel; ne pas faire surgir un nouveau fileChooser à chaque besoin de (re)détermination d'un fichier (CSV) à charger. Or ce dernier comportement se passe à chaque interception d'événement " if (e.getSource() == openButton) " qui relanche chaque fois le code " showDialog(this, "Contenu dans tableau"); ".
    - Arriver à ce que 'openButton' soit reconnu par le compilateur.
    - Arriver à ce que 'returnVal' reçoive la valeur correspondant au bouton du 'file chooser' actionné, sans recréer un 'file chooser' chaque fois, c à d sans relancer un 'showOpenDialog()' chaque fois.

    Code
    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
     
    ...
    import ...
    ...
    private JFileChooser fileChooser;
    ...
        private void initGuiComponents()
        {
            fileChooser = new JFileChooser("/");
            fiNaExtFilter = new FileNameExtensionFilter("Exclusivement CSV", "csv");
    ...
            fileChooser.setFileFilter(fiNaExtFilter);
    ...
            layout.setHorizontalGroup
            (   layout.createParallelGroup(GroupLayout.Alignment.CENTER)
                .addGroup(layout.createParallelGroup(GroupLayout.Alignment.CENTER)
                    .addComponent(fileChooser, GroupLayout.PREFERRED_SIZE, 600, GroupLayout.PREFERRED_SIZE)
    ...
        @Override public void actionPerformed(ActionEvent e)
        {   // Handle open button action.
            if (e.getSource() == openButton)    // openButton est souligné en rouge : non trouvé par le compilateur.
            {   
                // int returnVal = fileChooser.showDialog(this, "Contenu dans tableau");
                if (returnVal == JFileChooser.APPROVE_OPTION)
                {   File file = fileChooser.getSelectedFile();
                    //This is where a real application would open the file.
                    System.out.println("Opening: " + file.getName() + ".");
                } else
                {   System.out.println("Open command cancelled by user.");
                }
            }
    ...

    Observations
    - Le fait de mettre 'fileChooser' dans les deux places adéquates du code du GroupLayout(), sans inclure "int returnVal = fileChooser.showDialog(this, "Contenu dans tableau");" quelque part dans le code fait apparaître le file chooser dans mon HMI, comme voulu.
    - "if (e.getSource() == openButton)" : Le compilateur ne trouve pas 'openButton'.
    - Lorsque j'actionne le bouton 'Ouvrir' du file chooser, j'observe en mode debug de mon IDE NetBeans que l''ActionEvent e' généré n'est pas passé à mon objet HMI intégrant le file chooser. Le programme ne passe pas par " if (e.getSource() == null) ". ('null' temporairement car 'openButton' n'est pas reconnu)



    P.S.: J'ai voulu insérer l'image PNG de l'HMI que je parviens à produire à l'aide du bouton ad-hoc de cette page d'édition. On obtient une petite pop-up comportant un champs de texte où figure "http://". J'ai tenté de remplacer "http://" par "C:...\répertoireDeMesImages\HMI1.png", mais en vain. Comment arriver à passer une image PNG résidant en mémoire de mon PC ?

    Merci d'avance pour vos tentatives de trouver réponse.
    "Ah oui ! Juste encore cette toute dernière petite question ..." (Columbo - Peter Falk)

  6. #6
    Membre expérimenté Avatar de Nico02
    Homme Profil pro
    Developpeur Java/JEE
    Inscrit en
    Février 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Developpeur Java/JEE
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 728
    Points : 1 622
    Points
    1 622
    Par défaut
    Je suis désolé mais je ne comprends vraiment rien à ce que tu veux faire..

    Explique moi en français, sans nom de variable ni rien car tout est ambigue dans tes propos.

    ne pas faire surgir un nouveau fileChooser à chaque besoin de (re)détermination d'un fichier (CSV) à charger
    Si tu as simplement besoin de faire de nouveaux traitements sur un fichier déjà sélectionné au préalable, pourquoi tu ne stockes pas ce fichier dans une variable pour pouvoir t'en resservir.

    Arriver à ce que 'returnVal' reçoive la valeur correspondant au bouton du 'file chooser' actionné, sans recréer un 'file chooser' chaque fois, c à d sans relancer un 'showOpenDialog()' chaque fois
    la méthode showOpenDialog() ne créée pas d'objet, elle ne fait qu'afficher la pop up de sélection. c'est comme si tu faisais un show(). Par contre tu ne pourras pas récupérer le returnVal si tu n'affiches pas la pop up.

    Ce openButton c'est quoi ? Il fait quoi ?

    Bref, laisse tomber les cotés technique et exprime un besoin clair car comme je te l'ai dis, je pense que tu essais de tout mélanger.

    Cdt.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    263
    Détails du profil
    Informations personnelles :
    Âge : 73
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 263
    Points : 121
    Points
    121
    Par défaut
    Bonjour Nico02.

    Au premier paragraphe du même document How to Use File Choosers, on peut lire
    Another way to present a file chooser is to add an instance of JFileChooser to a container.
    C'est ce que je veux faire, le conteneur étant un emplacement dans mon GroupLayout. Le 'file chooser' y apparaît actuellement, comme désiré.


    On rencontre 'openButton' aux alentours du premier quart du même document, dans le code qui suit la phrase
    The call to showOpenDialog appears in the actionPerformed method of the Open a File button's action listener:
    'openButton' est donc le bouton "Open a file ..." du panneau de départ de 'FileChooserDemo', qui cause l'événement e destiné à appeler l'affichage de la fenêtre pop-up 'file chooser' (showOpenDialog()). Je me trompais donc : 'openButton' n'est pas le bouton 'Ouvrir' du 'file chooser' lui-même. Oublions donc 'openButton' d'appel du 'file chooser', puisque le mien figure à demeure dans le GroupLayout.

    Mais mon problème reste entier : Après avoir sélectionné un fichier à l'aide du 'file chooser' dans mon GroupLayout, l'utilisateur actionnera le bouton 'Open'. L'événement produit par ce bouton 'openBut_FC' du 'file chooser' devrait donc être intercepté par la fonction " actionPerformed(ActionEvent e) " de ma classe, pour que le string pathNomFichier soit passé à une fonction qui va charger dans le tableau le contenu du fichier CSV sélectionné. Question restante : Comment recueillir l'objet 'openBut_FC' et le message de l'événement e qui y est associé ?

    Ce que j'ai testé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ...
        fileChooser.addActionListener(this);
        ...
        if (e.getSource() == fileChooser)
        { ...
           // Appel de 'populateTable()'
    Mais horreur : Le 'file chooser' se détache de mon GroupLayout et apparaît dans une fenêtre pop-up ! Ce que je ne veux pas ...
    Another way to present a file chooser is to add an instance of JFileChooser to a container.
    Comment éviter la frame pop-up et rester dans mon GroupLayout ?

    Merci.
    "Ah oui ! Juste encore cette toute dernière petite question ..." (Columbo - Peter Falk)

  8. #8
    Membre expérimenté Avatar de Nico02
    Homme Profil pro
    Developpeur Java/JEE
    Inscrit en
    Février 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Developpeur Java/JEE
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 728
    Points : 1 622
    Points
    1 622
    Par défaut
    Essaye plutôt comme ça.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    fileChooser.addActionListener( new ActionListener(){
     
        public actionPerformed( ActionEvent e ){
     
            if (e.getActionCommand() == JFileChooser.APPROVE_SELECTION)
                // Ton action sur le bouton OK
            else if (e.getActionCommand() == JFileChooser.CANCEL_SELECTION)
               // Ton action sur le bouton Cancel 
     
        }
    });

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    263
    Détails du profil
    Informations personnelles :
    Âge : 73
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 263
    Points : 121
    Points
    121
    Par défaut JFileChooser dans un conteneur; pas une JFrame pop-up
    Cher Nico02,

    C'est réussi : un autre 'ActionListener()'. Qu'on se le dise !

    Un tout grand merci pout tes efforts et ta solution.
    "Ah oui ! Juste encore cette toute dernière petite question ..." (Columbo - Peter Falk)

  10. #10
    Membre expérimenté Avatar de Nico02
    Homme Profil pro
    Developpeur Java/JEE
    Inscrit en
    Février 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Developpeur Java/JEE
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 728
    Points : 1 622
    Points
    1 622
    Par défaut
    Y'a pas de quoi

    Oublie pas de marquer le sujet comme

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

Discussions similaires

  1. [Python 3.X] Accès à un nom de fichier sélectionné par askopenfile
    Par P.G dans le forum Général Python
    Réponses: 2
    Dernier message: 19/06/2015, 23h48
  2. [JFileChooser] Récupération du String dans le champs "Nom du fichier :"
    Par PaperBird dans le forum Agents de placement/Fenêtres
    Réponses: 3
    Dernier message: 30/08/2011, 13h17
  3. Recuperer path sans nom du fichier
    Par Happy dans le forum C++
    Réponses: 8
    Dernier message: 01/12/2006, 11h55
  4. Supprimer les espaces des noms de fichier
    Par Cathy dans le forum Linux
    Réponses: 20
    Dernier message: 04/08/2005, 17h13

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