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

 Java Discussion :

Problème pour utiliser une variable d'une class a l'autre


Sujet :

Java

  1. #1
    Membre du Club Avatar de Tryp'
    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Novembre 2008
    Messages : 48
    Points : 53
    Points
    53
    Par défaut Problème pour utiliser une variable d'une class a l'autre
    Bonjour à tous,

    Je me permet de faire appel a vous car je me torture la tête depuis quelques jours pour essayer de trouver une solution a mon problème, mais rien n'y fait.
    Je vous explique la situation :
    Le programme que je souhaite réaliser est un petit logiciel qui va redimensionner une image.

    Pour ce faire, j'ai donc deux classe JFfenetre et JFouvrir.
    JFfenetre est ma class principale ou je souhaite que l'image s'affiche une fois que l'utilisateur l'aura choisis. (je ne suis pas encore à la redimension, juste a l'affichage de cette fameuse image).

    Pour l'afficher, l'utilisateur va aller dans JFouvrir qui fait appel à un JFileChooser et sélectionner son image.
    J'arrive a récupérer le chemin de cette image (ex : user/.../monimage.png).
    Cependant, cette adresse de l'image se trouve dans JFouvrir et je voudrais la transmettre dans JFfenetre.

    C'est la que le problème apparait. J'ai créer des accesseurs, rien n'y fait, je les ai mis en public, rien n'y fait non plus.
    Je vous met une petite partie de mon code en vous remerciant d'avance.

    J'espère avoir était assez explicite dans mon problème,

    Merci d'avance pour vôtre aide.

    Extrait de JFfenetre (la fenêtre ou s'affichera l'image choisis)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public void actionPerformed(ActionEvent e) {
            String action = e.getActionCommand(); // Si la personne a cliqué sur quitter
            if (action.equals("Quitter")) {
                System.exit(0);
     
            } else if (action.equals("Ouvrir")) {
    // Sinon on lui ouvre la class Ouvrir, c'est ici que ce trouve le JFileChooser
                JFouvrir open = new JFouvrir(); 
            }
        }
    Extrait de JFouvrir contenant le JFilechooser qui s'appel choix
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
        public void actionPerformed(ActionEvent e) {
     
             String action = e.getActionCommand();
     
             if(action.equals(choix.APPROVE_SELECTION)){
                 icon = choix.getIcon(chemin);
                 chemin =  choix.getSelectedFile(); // retourner un fichier file
                 chem = chemin.getAbsolutePath(); // retourne un String
     
                 System.out.println(chem); // Fonctionne parfaitement.
                 this.setVisible(false);
    //Le problème est que je souhaiterais pouvoir utiliser le contenue de chem dans mon autre class JFfenetre. Mais chem reste vide tant qu'on n'a pas choisis d'image... Je ne sais vraiment pas comment procéder.
    Merci pour vos lumières.


    Tryp'

  2. #2
    Membre expérimenté
    Avatar de visiwi
    Profil pro
    Inscrit en
    Février 2008
    Messages
    1 050
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 1 050
    Points : 1 340
    Points
    1 340
    Par défaut
    Salut,

    Une solution simple est de créer un attribut String dans ta classe JFouvrir qui stockera le chemin, et de créer un accesseur pour pouvoir récupérer cette valeur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    private String path;
    ...
    this.path = chemin.getAbsolutePath();
    Ensuite depuis ta classe JFfenetre, il est facile de récupérer le chemin avec l'accesseur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    JFouvrir open = new JFouvrir(); 
    String path = open.getPath();
    Ceci implique que JFouvrir soit une fenêtre modale, ou que le JFileChooser (qui est modal) soit utilisé depuis le constructeur.

    Ce qui me conduit à te demander si ta classe JFouvrir est impérative ? Ne peut tu directement utiliser un JFileChooser depuis JFfenetre ?

  3. #3
    Membre du Club Avatar de Tryp'
    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Novembre 2008
    Messages : 48
    Points : 53
    Points
    53
    Par défaut
    Bonsoir Visiwi,

    Tout d'abord merci de ta réponse.
    J'ai appliqué ce que tu m'as dit mais hélas cela ne change rien au problème.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    // Dans JFfenetre
    //Quand l'utilisateur clique sur ouvrir, on appel JFouvrir
    if (action.equals("Ouvrir")) { 
                JFouvrir open = new JFouvrir();
                String path = open.getPath();
                System.out.println(path);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    // Dans JFouvrir
    //Quand l'utilisateur a choisis son image
             if(action.equals(choix.APPROVE_SELECTION)){    
                 chemin =  choix.getSelectedFile(); // file
                 this.path = chemin.getAbsolutePath(); // String
                 icon = choix.getIcon(chemin);
                 System.out.println(path + " de la class JFouvrir ");
    Dans JFfenetre, il me retourne null pour path, j'imagine qu'il l'execute tout de suite après avoir fait appel a JFouvrir et donc en effet path et null.
    Dans JFouvrir, j'ai bien la bonne valeur de mon path.
    Cependant je ne peut pas la retourné au bon moment.

    En ce qui concerne tes questions :

    Mes deux class sont en écrite ainsi :
    public class JFouvrir extends JFrame implements ActionListener{
    public class JFfenetre extends JFrame ....

    Je n'ai jamais encore entendu parlé de fenêtre modale, donc je me suis renseigner afin de te répondre, il sagit de JDialog?
    Idem pour impérative, je ne saurais pas te répondre , a quoi cela sert t'il?
    Sur internet je n'ai pas vraiment trouvé de réponse concrète.

    Merci beaucoup

  4. #4
    Membre expérimenté
    Avatar de visiwi
    Profil pro
    Inscrit en
    Février 2008
    Messages
    1 050
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 1 050
    Points : 1 340
    Points
    1 340
    Par défaut
    impérative dans le sens ou est-ce que tu peut t'en passé ou pas, cela ne faisait pas référence à un concept que tu ne connaitrais pas. Pourquoi ne pas utiliser un JFileChooser depuis ta classe principal, ce qui règlerais le problème rapidement. Toi qui connait ton projet tu as peut-être la réponse mais nous non.

    Modal signifie en tout cas par rapport à ce cas précis, que la fenêtre bloquera l'application jusqu'à ce qu'elle soit "détruite". Ce qui permet au deux lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    JFouvrir open = new JFouvrir();
                String path = open.getPath();
    d'être cohérente : après JFouvrir open = new JFouvrir(); l'appli attend que la fenêtre soit fermé, et donc lorsque String path = open.getPath(); s'exécute, tu obtiendrais bien la valeur choisi.

    Pourquoi ne pas poster l'ensemble de ton code ?

  5. #5
    Membre du Club Avatar de Tryp'
    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Novembre 2008
    Messages : 48
    Points : 53
    Points
    53
    Par défaut
    Merci encore pour ton soutien.
    Tu a raison, je vais poster tout mon code, j'ai hésité a le faire dans le sens ou je ne veut pas faire celui qui pose son truc et qui laisse faire les autres .

    Alors, voici ma classe JFfenetre.
    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    public class JFfenetre extends JFrame implements ActionListener {
     
        private JPanel panneau;
        JLabel label = new JLabel();
        private JMenuBar menuBar;
        private JMenu menuFichier;
        private JMenu menuAPropos;
        private String chem = "";
        private Icon icon;
     
        public JFfenetre() {
            super("Redimagic");
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            getContentPane().setLayout(null);
            this.init();
        }
     
        private void init() {
     
            menuBar = new JMenuBar();
            panneau = new JPanel();
            panneau.setBounds(20, 20, 200, 200);
            panneau.setBackground(Color.red);
            getContentPane().add(panneau);
     
     
     
            menuFichier = new JMenu("Fichier");
            menuFichier.setMnemonic(KeyEvent.VK_F);
     
            menuAPropos = new JMenu("A propos");
            menuAPropos.setActionCommand("A propos");
     
            JMenuItem mnOuvrir = new JMenuItem("Ouvrir", KeyEvent.VK_O);
            mnOuvrir.setActionCommand("Ouvrir");
     
            JMenuItem mnItemQuitter = new JMenuItem("Quitter", KeyEvent.VK_Q);
            mnItemQuitter.setActionCommand("Quitter");
     
            menuBar.add(menuFichier);
            menuBar.add(menuAPropos);
            menuFichier.add(mnOuvrir);
            menuFichier.add(mnItemQuitter);
     
            this.setJMenuBar(menuBar);
            mnItemQuitter.addActionListener(this);
            mnOuvrir.addActionListener(this);
     
     
            this.setSize(700, 400);
            this.setVisible(true);
            this.setResizable(false);
     
        }
     
        public void actionPerformed(ActionEvent e) {
     
            String action = e.getActionCommand();
            if (action.equals("Quitter")) {
                System.exit(0);
     
            } else if (action.equals("Ouvrir")) {
                JFouvrir open = new JFouvrir();
                String path = open.getPath();
                System.out.println(path);
     
     
            }
     
     
     
        }
     
        public void setIcon(Icon icon) {
            this.icon = icon;
            label.setIcon(icon);
     
        }
    }
    Et ma class JFouvrir
    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
    public class JFouvrir extends JFrame implements ActionListener{
        private JFileChooser choix = new JFileChooser();
        private File chemin;
        private String chem;
        private Icon icon;
        private String path;
     
     
        public JFouvrir() {
            super("Redimagic - Ouvrir un fichier");
            this.setSize(500, 300);
            this.setResizable(false);
     
            SimpleFileFilter filtre = new SimpleFileFilter();
            choix.setFileFilter(filtre);
            this.add(choix);
            choix.addActionListener(this);
            this.setVisible(true);
            }
     
        public void actionPerformed(ActionEvent e) {
     
             String action = e.getActionCommand();
     
             if(action.equals(choix.APPROVE_SELECTION)){    
                 chemin =  choix.getSelectedFile(); // file
                 this.path = chemin.getAbsolutePath(); // String
                 icon = choix.getIcon(chemin);
                 System.out.println(path + " de la class JFouvrir ");
     
     
            }else if(action.equals(choix.CANCEL_SELECTION)){
                this.dispose();
            }else{
                JOptionPane.showMessageDialog(null, "Erreur lors de l'ouverture du fichier.\nExtensions accepté : " +
                        "\n(jpg,jpeg,bmp,gif,png)","Erreur",JOptionPane.ERROR_MESSAGE);
            }
     
     
        }
     
        public String getPath() {
            return path;
        }
     
    }
    Pour essayer de répondre a ta question , je pense en effet que je peu me passer de JFouvrir, mais je ne vois pas comment je doit procédé, ni comment mettre mon programme en attente tant que l'utilisateur n'a pas choisis d'image.

    Edit : J'ai essayé de faire avec un JDialog comme j'ai cru comprendre d'après ton explication afin de ne pas me servir de mon autre class.
    Cependant le problème est autre cette fois.

    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
        public void actionPerformed(ActionEvent e) {
     
            String action = e.getActionCommand();
            if (action.equals("Quitter")) {
                System.exit(0);
     
            } else if (action.equals("Ouvrir")) {
                JDialog diag = new JDialog();
                setTitle("Redimagic - Ouvrir un fichier");
                JFileChooser choix = new JFileChooser();
                diag.getContentPane().add(choix);
                diag.setSize(500, 300);
                diag.setVisible(true);
     
                if (action.equals(choix.APPROVE_SELECTION)) {
                    chemin = choix.getSelectedFile();
                    this.path = chemin.getAbsolutePath();
                    System.out.println(path);
                } else if (action.equals(choix.CANCEL_SELECTION)) {
                    this.dispose();
                } else {
                    JOptionPane.showMessageDialog(null, "Erreur lors de l'ouverture du fichier.\nExtensions accepté : " +
                            "\n(jpg,jpeg,bmp,gif,png)", "Erreur", JOptionPane.ERROR_MESSAGE);
                }
            }
    Une fois que l'utilisateur a cliqué sur "Ouvrir" on lui fait le JDialog avec le Filechooser et tout et tout, mais il y'a immédiatement le Joptionpane qui s'affiche. Donc il n'attend pas qu'on ai fait un choix avant de continuer. Je pense que mon soucis ce situe la.
    Presque, presque ... grr java quand tu nous tien
    Merci beaucoup

  6. #6
    Membre expérimenté
    Avatar de visiwi
    Profil pro
    Inscrit en
    Février 2008
    Messages
    1 050
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 1 050
    Points : 1 340
    Points
    1 340
    Par défaut
    En fait, un JFileChooser est modal. Donc en l'utilisant ça règle tout de suite le problème.

    Sinon, pour créer une fenêtre modale, tu utilise un JDialog à la place d'un JFrame. Puis tu appel la méthode setModalityType ou quelque chose du genre, je cite de mémoire. Tu passe un enum en argument, ce doit être ModalityType avec APPLICATION_MODAL ou quelque chose approchant. Il est peut-être aussi possible d'utiliser un boolean à partir d'un constructeur de JDialog, mais perso j'utilise toujours la méthode setModalityType (c'est arbitraire, seulement parce que j'ai l'habitude de faire comme ça).

    Si tu veux je posterais les deux soluce plus tard (je doit m'absenter quelque instant), à moins que tu es trouvé la solution d'ici là.

  7. #7
    Membre du Club Avatar de Tryp'
    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Novembre 2008
    Messages : 48
    Points : 53
    Points
    53
    Par défaut
    Je m'y approche !
    Alors petite mise au point après quelques essais.

    Mon 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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    public class JFfenetre extends JFrame implements ActionListener {
     
        private JPanel panneau;
        JLabel label = new JLabel();
        private JMenuBar menuBar;
        private JMenu menuFichier;
        private JMenu menuAPropos;
        private String chem = "";
        private File chemin;
        private Icon icon;
        private String path;
     
        public JFfenetre() {
            super("Redimagic");
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            getContentPane().setLayout(null);
            this.init();
        }
     
        private void init() {
     
            menuBar = new JMenuBar();
            panneau = new JPanel();
            panneau.setBounds(20, 20, 200, 200);
            panneau.setBackground(Color.red);
            getContentPane().add(panneau);
     
     
     
            menuFichier = new JMenu("Fichier");
            menuFichier.setMnemonic(KeyEvent.VK_F);
     
            menuAPropos = new JMenu("A propos");
            menuAPropos.setActionCommand("A propos");
     
            JMenuItem mnOuvrir = new JMenuItem("Ouvrir", KeyEvent.VK_O);
            mnOuvrir.setActionCommand("Ouvrir");
     
            JMenuItem mnItemQuitter = new JMenuItem("Quitter", KeyEvent.VK_Q);
            mnItemQuitter.setActionCommand("Quitter");
     
            menuBar.add(menuFichier);
            menuBar.add(menuAPropos);
            menuFichier.add(mnOuvrir);
            menuFichier.add(mnItemQuitter);
     
            this.setJMenuBar(menuBar);
            mnItemQuitter.addActionListener(this);
            mnOuvrir.addActionListener(this);
     
     
            this.setSize(700, 400);
            this.setVisible(true);
            this.setResizable(false);
     
        }
     
        @SuppressWarnings("static-access")
        public void actionPerformed(ActionEvent e) {
     
            String action = e.getActionCommand();
            if (action.equals("Quitter")) {
                System.exit(0);
     
            } else if (action.equals("Ouvrir")) {
                JDialog dial = new JDialog(); // On créer une nouvelle boite de dialog
                dial.setModalityType(ModalityType.APPLICATION_MODAL); // On lui dit d'attendre que l'action soit fini
                dial.setTitle("Redimagic - Ouvrir un fichier");
                JFileChooser choix = new JFileChooser(); // On créer le jfilechooser
                choix.addActionListener(this);
                SimpleFileFilter filtre = new SimpleFileFilter(); // On filtre les images
                choix.setFileFilter(filtre);
                dial.getContentPane().add(choix); // On l'ajoute au Jdiag
                dial.setSize(500, 300);
                dial.setVisible(true);
                if (action.equals(choix.APPROVE_SELECTION)) {
                    chemin = choix.getSelectedFile();
                    this.path = chemin.getAbsolutePath();
                    System.out.println(path);
                } else if (action.equals(choix.CANCEL_SELECTION)) {
                    this.dispose();
                } else {
                    JOptionPane.showMessageDialog(null, "Erreur lors de l'ouverture du fichier.\nExtensions accepté : " +
                            "\n(jpg,jpeg,bmp,gif,png)", "Erreur", JOptionPane.ERROR_MESSAGE);
                }
            }
     
     
     
        }
    }
    Le soucis qui subsiste c'est d'après moi que action ( qui est égale a e.getActionCommand(); ne change pas car il est déjà utilisé quand on clique sur "Ouvrir", après on ne lui donne pas d'autre valeurs, donc il va ilico afficher mon JOptionPane avec le message d'erreur.
    Je ne sais pas trop quoi faire a ce niveau la

    Merci encore

  8. #8
    Membre expérimenté
    Avatar de visiwi
    Profil pro
    Inscrit en
    Février 2008
    Messages
    1 050
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 1 050
    Points : 1 340
    Points
    1 340
    Par défaut
    Et bien, je ne sais pas trop ce que tu as fait avec le JFileChooser, mais cette approche est plus pratique :
    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 void actionPerformed(ActionEvent e) {
            String action = e.getActionCommand();
            if (action.equals("Quitter")) {
                System.exit(0);
     
            } else if (action.equals("Ouvrir")) {
                JFileChooser chooser = new JFileChooser();
                int retour = chooser.showOpenDialog(this);
                if (retour == JFileChooser.APPROVE_OPTION) {
                    File file = chooser.getSelectedFile();
                    System.out.println(file.getAbsolutePath());
                }
            }
        }
    Tu peux placer chooser en attribut pour de meilleur perf.

  9. #9
    Membre du Club Avatar de Tryp'
    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Novembre 2008
    Messages : 48
    Points : 53
    Points
    53
    Par défaut
    Merci beaucoup Visiwi pour le temps que tu as consacrer a mon problème.
    Je vois surtout maintenant que le problème est résolue que je me suis compliqué la vie jusqu'au bout.
    Que mes 20 lignes de codes qui ne fonctionné pas complètement et fonctionne a présent avec 3 lignes ^^
    Merci pour l'aide fournis !

    Sujet résolu grâce a toi

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

Discussions similaires

  1. Problème pour utiliser la méthode d'une classe
    Par Freddrick dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 09/09/2012, 18h43
  2. Problème pour placer un chemin dans une variable
    Par steph70 dans le forum Tkinter
    Réponses: 2
    Dernier message: 06/03/2009, 17h48
  3. Réponses: 2
    Dernier message: 10/04/2008, 11h48
  4. Réponses: 2
    Dernier message: 21/09/2007, 17h27
  5. Réponses: 1
    Dernier message: 15/02/2007, 00h24

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