Interface graphique en java

Résolu/Fermé
fafall Messages postés 8 Date d'inscription lundi 29 octobre 2012 Statut Membre Dernière intervention 12 juillet 2013 - 5 juil. 2013 à 23:45
js95 Messages postés 773 Date d'inscription samedi 14 juin 2008 Statut Membre Dernière intervention 29 juillet 2014 - 13 juil. 2013 à 16:05
Bonjour,


je veux utilisé les interface graphique et je veux me connecter avec ma base de donnée mais en compilant ma fenêtre je n'obtiens rien comme message.
Pourriez vous m'aider s'il vous plait?

public static Connection initConnection () {
Connection MaConnection= null;
String url = "jdbc:mysql://localhost:3306/ci_ugb";
try{
//Le chargement du pilote
Class.forName("org.gjt.mm.mysql.Driver");
}catch (Exception e) {
System.out.println("Impossible décharger le pilote jdbc");
}
try{
//L'établissement de la connexion
MaConnection = (Connection) DriverManager.getConnection(url,"fatou","admin");
}
catch (SQLException se) {
System.out.println("Connexion Impossible");
}
return MaConnection;
}


public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub

if (e.getSource()== valider){
String s1 = jTextField.getText();
String s2 = jPasswordField.getText();
if ((s1!="") && (s2!="")){
Connection maCo = initConnection();
if (maCo == null) return;
String req = "Select * from users";
try{
Statement st = maCo.createStatement();
ResultSet rs = st.executeQuery(req);
while (rs.next()){
if((rs.getString("login").equals(s1)) &&
(rs.getString("password").equals(s2))){
this.dispose();
JFrame fen = new Menu() ;
fen.setVisible(true) ;
}
else
System.out.println("Erreur Login : Login ou mot de passe non valide.");
}
rs.close(); st.close(); maCo.close();
}
catch (SQLException se) {
System.out.println("connexion impossible");
}
}
else
JOptionPane.showMessageDialog(null, "il faut Remplire les chanps vides");
}else
if (e.getSource()== jButton){
this.dispose();
System.exit(0);
}
}

3 réponses

js95 Messages postés 773 Date d'inscription samedi 14 juin 2008 Statut Membre Dernière intervention 29 juillet 2014 354
6 juil. 2013 à 18:56
Bonjour,
plusieurs remarques :
-> Les classes java, les composants swing en particulier, commencent par une majuscule,
jTextField => JTextField
jButton => JButton
jPasswordField => JPasswordField
Ces composants sont sans doute des variables dans ton code, mais elles ne sont pas déclarées dans l'extrait de code que tu fournis.

-> s1 != ""
Non, ici on veut comparer une chaîne à la chaîne vide, mais java va comparer les emplacements mémoire de "" et de s1, ce qui n'est pas ce qu'on veut. Utilise plutôt
!s1.isEmpty()
Pareil pour s2.


-> JFrame fen = new Menu();
NetBeans dit que les types Menu et JFrame sont incompatibles.
Ton problème vient très probablement de là.

-> Il serait bien de donner une taille minimale à la fenêtre (JFrame) ou d'appeler la méthode pack() avant de l'afficher.

-> Si tu pouvais préciser dans quelle classe tu as mis la méthode actionPerformed ci-dessus et la classe des objets non référencés (valider, etc.) dans le code ci-dessus cela pourrait nous aider à t'aider.

-> Remarque d'optimisation concernant la requête :
c'est très coûteux d'extraire toute la table pour un seul utilisateur. J'aurais plutôt fait un
SELECT password FROM users WHERE login=''
en mettant le login dans la requête entre les deux '. Après il n'y a plus qu'à vérifier que le mot de passe est bon pour autoriser la connexion.
Mais attention, dans ce cas il faut faire une requête préparée pour éviter le risque d'injection SQL. Je te l'explique dans un second post si j'arrive à remettre la main sur un code similaire...
1
js95 Messages postés 773 Date d'inscription samedi 14 juin 2008 Statut Membre Dernière intervention 29 juillet 2014 354
6 juil. 2013 à 19:40
Voici ce que donnerait la méthode actionPerformed :

    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == valider) {
            String s1 = jTextField.getText();
            String s2 = jPasswordField.getText();
            if ((!s1.isEmpty()) && (!s2.isEmpty())) {
                Connection maCo = initConnection();
                if (maCo == null) {
                    return;
                }
                String req = "SELECT password FROM users WHERE login=?";
                 /* Le point d'interrogation remplace la donnée sensible qui sera controlée avant l'insertion dans la requête, on fait donc une requête "à trous" */
/* A EVITER ABSOLUMENT :
     String req = "SELECT password FROM users WHERE login='".s1."'";
car là il y a risque d'injection SQL, si l'utilsateur entre du code sql après une apostrophe, il peut faire ce qu'il veut avec la base de données */

                try {
                    PreparedStatement st = (PreparedStatement) maCo.prepareStatement(req);
                    st.setString(1, s1);
/* on remplace le premier trou (d'où le 1, ici il n'y a qu'un seul trou) par la chaîne s1, la méthode setString indique au SGBD qu'il s'agit d'un VARCHAR, la chaîne s1 est donc insérée correctement dans la requête et aucun code SQL éventuellement saisi par l'utilisateur ne pourra être interprété par le SGBD */
                   
                    ResultSet rs =  st.executeQuery();
                    
                    if (rs.next()){ // il n'y a qu'un resultat à analyser
                        if( rs.getString("password").equals(s2) ){
                            // on autorise la connexion
                            this.dispose(); // appelé sur la fenêtre courante (de login je suppose)
                            JFrame fen = new JFrame("Connexion établie"); // exemple de fenêtre
                            fen.getContentPane().add(new JLabel("Connexion établie avec succès !"));
                            fen.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                            fen.pack();
                            fen.setVisible(true);
                        }else{ // on refuse
                            System.out.println("Mot de passe invalide");
                        }
                    } else { // on refuse : pas de résultat, le login n'a pas été trouvé dans la BDD
                            System.out.println("Login invalide");
                    }
                    rs.close();
                    st.close();
                    maCo.close();
                } catch (SQLException se) {
                    System.out.println("connexion impossible");
                }
            } else {
                JOptionPane.showMessageDialog(null, "il faut remplir les champs vides");
            }
        } else if (e.getSource() == jButton) {
            this.dispose();
            System.exit(0);
        }
    }

J'ai commenté le code pour expliquer.
0
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
6 juil. 2013 à 20:04
"JFrame fen = new Menu();
NetBeans dit que les types Menu et JFrame sont incompatibles.
Ton problème vient très probablement de là."


Comment peux tu savoir que Menu est de type incompatible alors que tu n'as pas la déclaration de la classe Menu ? Il s'agit surement d'une classe Menu extends JFrame, dans ce cas un tel message ne serait pas affiché.

Sinon, rien à redire ;-)
0
js95 Messages postés 773 Date d'inscription samedi 14 juin 2008 Statut Membre Dernière intervention 29 juillet 2014 354
6 juil. 2013 à 20:24
En effet, mais sans le code on ne peut pas savoir.
Le problème peut très bien se trouver dans le code de la classe Menu, on ne sait pas.
0
fafall Messages postés 8 Date d'inscription lundi 29 octobre 2012 Statut Membre Dernière intervention 12 juillet 2013
6 juil. 2013 à 23:32
Merci beaucoup j'ai pu retrouvé mes erreurs grâce à vous. Merci encore une fois.

Cordialement
0
fafall Messages postés 8 Date d'inscription lundi 29 octobre 2012 Statut Membre Dernière intervention 12 juillet 2013
6 juil. 2013 à 23:52
S'il vous plait j'avais installer EclipseVE pour ma modélisation en UML mais actuellement je peux plus accéder à mes diagrammes et il m'affiche se message quand j'essaye de l'ouvrir il m'ecrit ce message.

The diagram has been corrupted for unknown reasons. Please select your diagram in the package explorer, open the popup menu and select replace With >Loval History.... in order to restore your previous diagram.

Merci d'avance
0
js95 Messages postés 773 Date d'inscription samedi 14 juin 2008 Statut Membre Dernière intervention 29 juillet 2014 354
13 juil. 2013 à 16:05
Personnellement j'utilise Dia pour les diagrammes et je ne savais pas qu'il était possible de les faire dans Eclipse. Je ne peux malheureusement pas t'aider sur cette question.
0