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 :

Changer le container principal via ActionListener


Sujet :

Agents de placement/Fenêtres Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2018
    Messages : 6
    Par défaut Changer le container principal via ActionListener
    Bonjour,

    Ma question est assez difficile à expliquer...

    Le but est que l'utilisateur de l'application n'accède à ses fonctionnalités que s'il connait un certain mot de passe. Pour ce faire, j'ai crée une classe PanelConnexion qui contient le panneau de connexion. Sur celui-ci, il y a un ActionListener qui détecte si le mot de passe est bon ou pas.

    J'aimerais que le container principal change dans le cas ou le mot de passe est correcte. Mais je ne trouve pas comment faire, étant donné que le panneau de connexion est externe à la classe de la fenêtre principale.

    Voilà mon code:

    PanelConnexion (je ne sais pas quoi mettre au //TODO)
    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
     
    public class PanelConnexion extends JPanel{
        private JLabel login, password;
        private JTextField fLogin;
        private JPasswordField fPassword;
        private JButton bValider;
     
        PanelConnexion(){
     
            this.setBounds(0,0,200,100);
     
            login = new JLabel("Nom de compte :");
            fLogin = new JTextField(20);
     
            password = new JLabel("Mot de passe :");
            fPassword = new JPasswordField(20);
     
            bValider = new JButton("valider");
     
     
            GridLayout connexionLayout = new GridLayout(0,2);
            this.setLayout(connexionLayout);
     
            this.add(login);
            this.add(fLogin);
            this.add(password);
            this.add(fPassword);
            this.add(bValider);
     
            GestionnaireBouton g = new GestionnaireBouton();
            bValider.addActionListener(g);
        }
     
        private class GestionnaireBouton implements ActionListener{
            public void actionPerformed(ActionEvent e){
                String l = fLogin.getText();
                String p = new String(fPassword.getPassword());
                if(l.equals("admin") && p.equals("123"))
                {
                    //TODO
                }
                else{
                    fLogin.setText("");
                    fPassword.setText("");
                    JOptionPane.showMessageDialog(null, "Identifiants incorrects", "Erreur", JOptionPane.ERROR_MESSAGE);
                }
            }
        }
    }
    Fenêtre principale: (ne contient que le panneau de connexion pour le moment)
    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
     
    public class Fenetre extends JFrame{
        private Container cont;
        private PanelConnexion pConnexion;
     
        public Fenetre(){
            super("Application Pastel");
            setBounds(200,200,500,500);
     
            MyWindowListener w = new MyWindowListener();
            this.addWindowListener(w);
     
            PanelConnexion pConnexion = new PanelConnexion();
     
            cont = getContentPane();
            cont.setLayout(null);
            cont.add(pConnexion);
     
            setVisible(true);
        }
     
        private class MyWindowListener extends WindowAdapter{
            public void windowClosing(WindowEvent e)
            {System.exit(0);}
        }
    }
    Merci beaucoup pour le temps que vous m'accorderez !

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    Tu peux passer la JFrame en paramètre de PanelConnexion, puis à l'ActionListener, ce qui permet de modifier son contentpane dans le if.

    Ou accéder directement comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if(l.equals("admin") && p.equals("123"))
                {
                    //TODO
                	JFrame frame = (JFrame) SwingUtilities.getWindowAncestor((Component)e.getSource()); // récupère la JFrame parent
                	frame.getContentPane().removeAll(); // on supprime tous les composants dans le content pane
                	frame.getContentPane().add(new Panel()); // on ajoute le composant qu'on veut
                	frame.getContentPane().revalidate(); // on rafraîchit le layout
    }
    Evite en revanche les layouts null. Il vaut mieux faire de l'adaptation. Et à la place du revalidate(), tu pourrais faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    frame.pack(); // redimensionner la fenêtre en l'adaptant au nouveau panel
    frame.setLocationRelativeTo(null); // recentrer la fenêtre
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2018
    Messages : 6
    Par défaut
    Ok, merci beaucoup pour ta réponse !
    Je vais essayer ça de suite !

  4. #4
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2018
    Messages : 6
    Par défaut
    Citation Envoyé par joel.drigo Voir le message
    Salut,

    Tu peux passer la JFrame en paramètre de PanelConnexion, puis à l'ActionListener, ce qui permet de modifier son contentpane dans le if.

    Ou accéder directement comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if(l.equals("admin") && p.equals("123"))
                {
                    //TODO
                	JFrame frame = (JFrame) SwingUtilities.getWindowAncestor((Component)e.getSource()); // récupère la JFrame parent
                	frame.getContentPane().removeAll(); // on supprime tous les composants dans le content pane
                	frame.getContentPane().add(new Panel()); // on ajoute le composant qu'on veut
                	frame.getContentPane().revalidate(); // on rafraîchit le layout
    }
    Evite en revanche les layouts null. Il vaut mieux faire de l'adaptation. Et à la place du revalidate(), tu pourrais faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    frame.pack(); // redimensionner la fenêtre en l'adaptant au nouveau panel
    frame.setLocationRelativeTo(null); // recentrer la fenêtre

    Tout d'abord merci beaucoup pour ta réponse (j'étais occupé donc je viens seulement de tester le code).

    ça fonctionne mais j'aimerais laisser la main à la classe de ma fenêtre principale. En fait j'aimerais que mes différents panneaux "échangent" avec ma classe fenêtre pour modifier à chaque fois le container.
    Je ne suis pas très expérimenté en Java (j'ai une vision plus proche du développement web). Je vois un peu ça comme une redirection d'une page à une autre en fonction d'un menu sur lequel on clique.

    Par exemple, en php, les pages sont développées indépendamment (comme les panneaux) puis c'est la page principale qui redirige tout... Je compte d'ailleurs utiliser par la suite un CardLayout

    Je ne sais pas si c'est faisable en Java ?? (de type modèle MVC par exemple)

    Encore merci pour ton aide !

    Edit:

    J'ajoute que j'ai essayé de passer par un booléen "isLog" que je teste dans la classe Fenetre pour modifier le container si il est égal à true. le problème est que sa valeur n'est testée qu'une fois, au moment ou il est encore en false.
    Je n'arrive vraiment pas à comprendre la logique...

  5. #5
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Oublie les notions de redirection. Si tu veux une analogie avec le Web, tu es plutôt dans le cadre d'une SPA et tu remplaces un div par un autre. On pourrait simuler le comportement d'un navigateur avec une imitation de redirection mais je trouve ça overkill pour deux composants. Un cardlayout aussi surtout que l'un des deux composants n'est affiché à priori qu'une fois.
    Pour découpler et laisser la responsabilité à la fenêtre de changer le composant tu peux mettre en place un système événementiel.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  6. #6
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2018
    Messages : 6
    Par défaut
    Ok merci, je vais faire ça, en espérant que ça m'éclaire sur la logique...

    Merci beaucoup !

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

Discussions similaires

  1. [SWING] Changer de container
    Par dedesite dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 20/02/2007, 12h38
  2. sous formulaire dans un principal via bouton
    Par tomas dans le forum IHM
    Réponses: 1
    Dernier message: 23/01/2007, 14h59
  3. Gestion de l'exe principal via une(des) DLL(s)
    Par floppy64 dans le forum C++Builder
    Réponses: 5
    Dernier message: 20/01/2007, 23h41
  4. Changer le contenu principal
    Par didier17062006 dans le forum C++Builder
    Réponses: 2
    Dernier message: 28/09/2006, 13h34
  5. [JavaScript] Changer la class CSS via l'id
    Par Romalafrite dans le forum Mise en page CSS
    Réponses: 1
    Dernier message: 25/11/2005, 15h30

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