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 :

Comment exploiter une variable d'une classe de type JFrame


Sujet :

Agents de placement/Fenêtres Java

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 51
    Points : 32
    Points
    32
    Par défaut Comment exploiter une variable d'une classe de type JFrame
    Bonjour,

    Je suis débutant en JAVA avec les interface graphique. Je voudrais utiliser la connexion que j'ai bien établi dans une classe de type JFrame (Car j'ai récupérer les paramètres de connexion utilisateur, mot de passe via l'interface) dans une autre classe où j'exécute les requêtes. Il affiche le message d'erreur "NulPointerException".

    Ci-jointes les deux classes que j'utilise.

    Merci d'avance votre réponse.
    Fichiers attachés Fichiers attachés

  2. #2
    Membre éclairé

    Profil pro
    Technicien
    Inscrit en
    Février 2009
    Messages
    338
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Février 2009
    Messages : 338
    Points : 791
    Points
    791
    Par défaut
    Bonjour,

    Le NullPointerException n'est pas suffisant comme information pour cibler l'origine de l'erreur. Une stack trace complète aurait été la bienvenue.

    J'ai rapidement repris les 2 fichiers chez moi. En lançant le main(), la popup de saisie des informations ne s'affiche pas. Il en résulte un NullPointerException car l'objet "Connexion conn" n'est pas initialisé.

    Après l'ajout de ces 2 lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            ConnexionFenetre connexionFenetre = new ConnexionFenetre();
            connexionFenetre.setVisible(true);
    la popup de saisie s'affiche, je peux saisir un utilisateur, un mot de passe et une base de données. En cliquant sur "Ok", l'objet "Connexion conn" va s'instancier et le problème de NullPointerException devrait disparaitre.

    Il y a effectivement une interface de définie dans le code, mais elle n'était jamais instanciée et l'utilisateur ne pouvait pas saisir les informations.
    Les 2 lignes rajoutées permettent d'instancier cette interface et de la rendre visible à l'utilisateur.
    Il faudra envisager de retirer le "static" sur l'objet Connexion maintenant que la classe est instanciée. Et aussi le Class.forName("ConnexionFenetre");

    Benoit

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 51
    Points : 32
    Points
    32
    Par défaut
    Bonjour,

    Merci pour votre réponse. Mais même après la modification comme vous m'avez proposé, je n'arrive toujours pas à utiliser la connexion que j'établis dans la classe "ConnextionFenetre" après avoir récupérer les paramètres(utilisateur, mot de passe et nom de base) via l'actionperformed du bouton "b_ok". J'ai toujours le NulPointerException à la ligne où j'utilise la connexion (Statement stmt = conn.createStatement(***)).

    Je pense que le programme s'exécute (le thread pour le programme) et termine avant l'exécution de l'interface graphique (thread swing). Je ne sais pas approprier les deux threads afin d'utiliser la connexion qui est le résultat de mon interface graphique dans le contexte d'une classe où j'ai mon main().

    Voici le code modifié de la classe TestConnexion:

    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
    public class TestConnexion {
         public static void main (String []args)
            throws SQLException
            {
                try
                {
                    ConnexionFenetre connexionFenetre = new ConnexionFenetre();
                    connexionFenetre.setVisible(true);
                Connection conn = connexionFenetre.get_Connexion();
     
                //Creation d'un etat de connexion et exécutions d'instructions SQL    
     
                Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
                ResultSet rset = stmt.executeQuery("SELECT ***");
                //Changeons la valeur des points
                int v_point = 0;
                while (rset.next())
                {
                    v_point=rset.getInt("***");
                    // Maj de la ligne
                    //
                    //rset.updateInt("***", v_point+1);
                    rset.updateInt(3, v_point+1);
                    //Maj dans la base
                    rset.updateRow();
                    conn.commit();
                //}
                }
     
                }
            //GESTION DES ERREURS
                catch (SQLException ex)
                {
                     System.err.println("Erreur:" +ex);
                }
            }    
    }
    Je vous remercie d'avance si quelqu'un peut m'aider.

  4. #4
    Membre habitué
    Homme Profil pro
    Ingénieur Informatique et Réseaux
    Inscrit en
    Avril 2011
    Messages
    232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Informatique et Réseaux
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 232
    Points : 182
    Points
    182
    Par défaut
    Le problème vient du fait que dans ton main tu créés ta fenêtre et ensuite tu veux accéder directement à l'objet "conn" alors qu'il n'a pas encore été initialisé par la méthode "etablir_Connexion()" qui est appelé par un "actionPerformed(ActionEvent e)" qui est lui même appelé quand tu cliques sur la fénêtre (le bouton b_ok).

    J'ai une solution mais elle est pas très belle:
    Il faut attendre que l'utilisateur clique sue le bouton "b_ok":

    ajoute une boucle "while" qui vérifie dans la classe "TestConnexion" l’état de ta fenêtre (apuis ou pas sur le bouton avec un boolean que tu rajoute dans la classe "ConnexionFenetre")

    ConnexionFenetre.java:
    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
    
    private boolean b_okClicked= false;
    
    public boolean get_b_okClicked() {
            return b_okClicked;
        }
    
    @Override
        public void actionPerformed(ActionEvent e) {
            Object source = e.getSource();
    
            if (source == b_ok) {
                System.out.println("Vous allez établir la connexion");
                this.etablir_Connexion();
                if (conn != null) {
                    System.out.println("La connexion est bien établie");
                }
                this.setVisible(false);
                b_okClicked = true
            } else if (source == b_quitter) {
                System.out.println("Vous aller quitter");
                this.setVisible(false);
            }
    
        }
    TestConnexion.java:
    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
    public class TestConnexion {
    
        public static void main(String[] args)
                throws SQLException {
            try {
                ConnexionFenetre connexionFenetre = new ConnexionFenetre();
                connexionFenetre.setVisible(true);
                while(true){
                    if (connexionFenetre.get_b_okClicked() == true){
                       Connection conn = connexionFenetre.get_Connexion();
    
    //Creation d'un etat de connexion et exécutions d'instructions SQL
    
                       Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
                       ResultSet rset = stmt.executeQuery("SELECT ***");
    //Changeons la valeur des points
                       int v_point = 0;
                       while (rset.next()) {
                           v_point = rset.getInt("***");
    // Maj de la ligne
    //
    //rset.updateInt("***", v_point+1);
                           rset.updateInt(3, v_point + 1);
    //Maj dans la base
                           rset.updateRow();
                           conn.commit();
                       
    //}
                        }
                        break;
                     }
                  }
    
            } //GESTION DES ERREURS
            catch (SQLException ex) {
                System.err.println("Erreur:" + ex);
            }
        }
    }

    Ceci fonctionnera mais c'est pas une solution très performante

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 51
    Points : 32
    Points
    32
    Par défaut
    Justement, je voudrais récupérer la connexion (qui est établie par la méthode etablir_Connexion qui est déclenché par l'événement click du bouton ok) avant que je procède à exécuter les requêtes avec cette connexion.
    Je veux que le programme ne continue qu'une fois le bouton est cliqué (soit b_ok ou b_quitter). Est-ce que cela est possible?

    Mon objectif est de préparer une classe commune pour établir la connexion (suivant les paramètres définies par les utilisateurs via une interface graphique) afin que tous les projets puissent l'utiliser sans occuper la partie connexion.

    Merci à Spiritkill. Mais, je cherche une solution propre afin de généraliser la classe connexion à tous les projets.

    Merci d'avance si quelqu'un peut m'aider.

  6. #6
    Membre éclairé

    Profil pro
    Technicien
    Inscrit en
    Février 2009
    Messages
    338
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Février 2009
    Messages : 338
    Points : 791
    Points
    791
    Par défaut
    Je vois 1 possibilité à te proposer : la classe chargée de l'interface accepte les "listener", la classe application s'ajoute comme listener de l'interface.
    Dès que l'interface possède la connexion, elle prévient son/ses listener(s) que la connexion est disponible.
    L'application pourra alors récupérer la connexion et effectuer le traitement souhaité.

    A voir si ça te convient.

    Benoit

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 51
    Points : 32
    Points
    32
    Par défaut
    Pourriez-vous m'expliquer un peu claire? Comme je suis débutant, je ne vois pas clairement comment peut-on dire à application à écouter l'interface fenêtre?. Merci d'avance.

  8. #8
    Membre éclairé

    Profil pro
    Technicien
    Inscrit en
    Février 2009
    Messages
    338
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Février 2009
    Messages : 338
    Points : 791
    Points
    791
    Par défaut
    Tu trouveras plus d'explications sur cette page : http://download.oracle.com/javase/tu...elistener.html

    Benoit

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 51
    Points : 32
    Points
    32
    Par défaut
    Merci Benoit.

    Je viens de jeter un coup d'œil sur le concept de "change listener". Je ne sais pas trop si je peux l'utiliser pour mon cas. Pour le moment je reste sur l'idée de Spiritkill. C'est à dire, j'ai créé une classe intermédiaire "Connexion" là j'instancie la classe ConnexionFenetre et crée une méthode getConnexion . A l'intérieur de cette dernière je teste si la connection de l'instance de la ConnexionFenetre dans une boucle infinie. Si c'est différent de null, on sort du boucle et envoie la connexion et ferme la fenetre. Voici la classe Connexion j'ai crée pour pouvoir exploiter la connexion qui est étable dans la classe ConnexionFenetre.

    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
    public class Connexion
    {
        private static Connection connection = null ;
        Connexion()
        {
        }
     
        public static Connection getConnection()
        throws java.sql.SQLException , java.lang.ClassNotFoundException
        {
            if (connection != null)
            {
                return connection ;
            }
     
            ConnexionFenetre fenetre = new ConnexionFenetre();
            fenetre.setVisible(true);
     
            while(true){
                if (connection != null ){                
                    fenetre.dispose();
                    break;
                }else{
                    connection = fenetre.get_Connexion();
                }
            }
            return connection ;
        }
     
        public static void disconnect()
        throws java.sql.SQLException
        {
            connection.close() ;
                connection = null ;
        }
    }

Discussions similaires

  1. Comment exploiter les variables dans une fonction ?
    Par spawns dans le forum Langage
    Réponses: 2
    Dernier message: 20/06/2011, 00h06
  2. Réponses: 2
    Dernier message: 13/02/2007, 17h40
  3. Comment récupérer le contenu d'une URL dans une variable ?
    Par Fildz dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 28/08/2006, 09h26
  4. Réponses: 7
    Dernier message: 02/05/2006, 16h28
  5. Réponses: 15
    Dernier message: 25/04/2006, 17h59

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