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

AWT/Swing Java Discussion :

Lancer un programme externe en cliquand sur un bouton


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 27
    Par défaut Lancer un programme externe en cliquand sur un bouton
    Voila donc j'ai un bouton dans mon code principal de ma fenetre :

    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
    public class GestionSQLFenetre extends JFrame{
     
    	private JLabel label,label2,label3,numeroEtudiantLabel,nomLabel,prenomLabel,numVoieLabel,voieLabel,villeLabel,codePostalLabel;
    	private JComboBox liste,liste2;
    	private JPanel panel;
    	private JButton bouton1,bouton2,bouton3;
    	private JTextField numeroEtudiantField,nomField,prenomField,numVoieField,voieField,villeField,codePostalField;
     
        public GestionSQLFenetre() {
        	super();
     
        	build();
        }
        private void build(){
        	setTitle("Gestion de la base de donnée"); //On donne un titre à l'application
    		setSize(470,400); //On donne une taille à notre fenêtre
    		setLocationRelativeTo(null); //On centre la fenêtre sur l'écran
    		setResizable(false); //On interdit la redimensionnement de la fenêtre
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //On dit à l'application de se fermer lors du clic sur la croix
    		setContentPane(buildContentPane());
       	}
       	private JPanel buildContentPane(){
                    //....
     
                    bouton3 = new JButton(new ExecutionRequete(this, "Executer"));
    		panel.add(bouton3); //On ajoute le bouton au panel
    		bouton3.setVisible(false);
     
                   //.....
    Donc ce bouton comme ces paramètre le montre il lance le programme ExecutionRequete que voici :

    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
    import java.awt.event.ActionEvent;
    import java.awt.*;
    import javax.swing.*;
     
     
    public class ExecutionRequete extends AbstractAction {
    	private GestionSQLFenetre fenetre;
    	private CreationEtudiant createEtudiant;
     
        public ExecutionRequete(GestionSQLFenetre fenetre, String texte) {
        	super(texte);
     
    		this.fenetre = fenetre;
        }
        public ExecutionRequete(CreationEtudiant createEtudiant, String texte){
        	super(texte);
     
        	this.createEtudiant = createEtudiant;
        }
     
        public void actionPerformed(ActionEvent e) { 
     
    		//Action lors du clic sur le bouton1
     
    		String gestion = fenetre.getModelGestion().getSelectedGestion();
    		String gestion2 = fenetre.getModelGestion2().getSelectedGestion2();
     
    		if (("Ajouter".equals(gestion2))&&("Gestion Etudiant".equals(gestion))){
    			createEtudiant.CreationEtudiant();
    		}
        }
     
    }
    Si la conditions est juste ( elle fonctionne tester avec boite de dialogue ) cela me lance la class CreationEtudiant(); donc qui se trouve dans le programme CreationEtudiant que voici

    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
    public class CreationEtudiant {
    	private GestionSQLFenetre fenetre;
    	private CreationEtudiant createEtudiant;
     
    	public void CreationEtudiant(){
    		try{
    			// Dec des variable
    			String numeroEtudiant,nom,prenom,numVoie,voie,ville,requete,idville,codePostal;
    			Statement stmt=null;
    			ResultSet rs;
     
    			numeroEtudiant = fenetre.getNumeroEtudiantField().getText();
    			nom = fenetre.getNomField().getText();
    			prenom = fenetre.getPrenomField().getText();
    			numVoie = fenetre.getNumVoieField().getText();
    			voie = fenetre.getVoieField().getText();
    			ville = fenetre.getVilleField().getText();
    			codePostal = fenetre.getCodePostalField().getText();
     
    			//connexion
    			Class.forName("com.mysql.jdbc.Driver");
    			String url ="jdbc:mysql://localhost/java";
    			// Pour les étudiants : String url="jdbc:mysql://src-mysql/<nom de votre base de données";
    			System.out.println("Connexion a la base de donnees");
    			Connection con = DriverManager.getConnection(url,"root", ""); // Pour les étudiants SRC utiliser utilisateur et mot de passe de connexion à la base de données
    			System.out.println("Connecte");
    			stmt = con.createStatement();
     
    			//Verification de l'existence de la ville dans la base de donnée
    			requete = "SELECT idville FROM ville WHERE ville='"+ville+"';";
    			rs = stmt.executeQuery(requete);
    			if (rs.next()){
    				idville = rs.getString ("idville");
    			} else {
    				idville = "";
    			}
    			if ( idville == "" ) {
    				// La ville n'existe pas
    				// Insertion de la ville dans la table Ville
    				requete = "INSERT INTO ville VALUES (NULL,'"+ville+"','"+codePostal+"');";
    				stmt.executeUpdate(requete);
    				System.out.println(requete);
    				// Insertion de la ville dans la table Adresse
    				requete = "INSERT INTO adresse VALUES (NULL,'"+voie+"','"+numVoie+"',(SELECT idville FROM ville WHERE ville='"+ville+"'));";
    				stmt.executeUpdate(requete);
    				System.out.println(requete);
    			} else {
    			// La ville Existe
    			// Ajout d'une adresse dans la Table adresse avec l'idville existant
    			requete = "INSERT INTO adresse VALUES (NULL,'"+voie+"','"+numVoie+"',(SELECT idville FROM ville WHERE ville='"+ville+"'));";
    			stmt.executeUpdate(requete);
    			System.out.println(requete);
    			}
     
    			//Requete d'insertion dans la table Etudiants
    			requete="INSERT INTO etudiants VALUES ('"+numeroEtudiant+"','"+nom+"','"+prenom+"',(SELECT idadresse FROM adresse WHERE voie = '"+voie+"' AND numVoie = '"+numVoie+"'));";
    			stmt.executeUpdate(requete);
    			System.out.println(requete);
     
    			//deconnexion
    			con.close();
    			System.out.println("Deconnecté");
     
    			fenetre.getLabel3().setText("La requete d'insertion d'un étudiant a été effectué avec succès");
     
    		}catch (Exception e){
    			e.printStackTrace();
    		}
    	}
    }
    Mais a ce niveau la dans la console il me sort :

    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
    --------------------Configuration: <Default>--------------------
    Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
        at ExecutionRequete.actionPerformed(ExecutionRequete.java:29)
        at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1849)
        at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2169)
        at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:420)
        at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:258)
        at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
        at java.awt.Component.processMouseEvent(Component.java:5501)
        at javax.swing.JComponent.processMouseEvent(JComponent.java:3135)
        at java.awt.Component.processEvent(Component.java:5266)
        at java.awt.Container.processEvent(Container.java:1966)
        at java.awt.Component.dispatchEventImpl(Component.java:3968)
        at java.awt.Container.dispatchEventImpl(Container.java:2024)
        at java.awt.Component.dispatchEvent(Component.java:3803)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4212)
        at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3892)
        at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3822)
        at java.awt.Container.dispatchEventImpl(Container.java:2010)
        at java.awt.Window.dispatchEventImpl(Window.java:1778)
        at java.awt.Component.dispatchEvent(Component.java:3803)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:463)
        at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:242)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)
    Donc pour récapituler :

    GestionSQLFenetre -> Appuie sur le bouton -> ExecutionRequete -> CreationEtudiant mais a ce dernier niveau cela ne fonctionne donc pas.
    Le seul moyen que j'ai trouver de faire fonctionner mon code CreationEtudiant et de mettre directement la class dans GestionSQLFentre

    et donc de l'appeller depuis ExecutionRequete comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    //........
     
    private GestionSQLFenetre fenetre;
     
    //..........
     
    fenetre.CreationEtudiant();
    Et la cela fonctionne mais ayant une 50aine de code de la même taille cela serai le bordel de toute mettre direct dedans.

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 152
    Par défaut
    Tu n'appelles jamais ce constructeur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public ExecutionRequete(CreationEtudiant createEtudiant, String texte){
        	super(texte);
     
        	this.createEtudiant = createEtudiant;
    }
    Donc c'est normal que ca plante ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    if (("Ajouter".equals(gestion2))&&("Gestion Etudiant".equals(gestion))){
    			createEtudiant.CreationEtudiant();
    }
    createEtudiant étant null, il lui est impossible d'appeller la méthode.

    Sinon un détail, renomme ta méthode "CreationEtudiant" en "creerEtudiant", ca permet d'éviter les confusions (j'ai cru que tu appelais un constructeur de manière très bizarre), les majuscules c'est uniquement pour les classes.

    Mais en fait après relecture je constates quelque chose de complétement illogique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public class CreationEtudiant {
    ...
    	public void CreationEtudiant(){
    ...
            }
    }
    Après modif:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public class CreationEtudiant {
    ...
    	public CreationEtudiant(){
    ...
            }
    }
    Sans le void ca marche beaucoup mieux!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    if (("Ajouter".equals(gestion2))&&("Gestion Etudiant".equals(gestion))){
    	createEtudiant = new CreationEtudiant();
    }
    Sinon au niveau du code la méthode/Constructeur CreationEtudiant fait beaucoup trop de choses.
    On ne comprend donc plus rien.
    et ca c'est vraiment laid :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    requete = "INSERT INTO adresse VALUES (NULL,'"+voie+"','"+numVoie+"',(SELECT idville FROM ville WHERE ville='"+ville+"'));";
    En fait cette classe, ne contient qu'un constructeur et fait 70 lignes, ce qui n'est pas normal.
    Tu devrais pouvoir extraire une dizaine de méthodes et la connexion (une méthode pour l'ouverture et une autre pour la fermeture) devrait se faire dans une autre classe. Puiseque je suppose que tu vas t'en reservir pour faire autre chose. Par exemple : "Lister Etudiant", "Modifier Etudiant"
    M'enfin je m'égare...

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 27
    Par défaut
    J'ai compris mon Souci en fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        public ExecutionRequete(GestionSQLFenetre fenetre, String texte) {
        	super(texte);
     
    		this.fenetre = fenetre;
        }
        public ExecutionRequete(CreationEtudiant createEtudiant, String texte){
        	super(texte);
     
        	this.createEtudiant = createEtudiant;
        }
    Ici j'ai 2 class pour faire comprendre que fenetre = GestioSQLFenetre et que createEtudiant = CreationEtudiant

    Mais le problème c'est qu'il me retourne null pour create étudiant car il execute la 1er class pour fenetre = GestioSQLFenetre mais pas la 2eme donc :

    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
    import java.awt.event.ActionEvent;
    import java.awt.*;
    import javax.swing.*;
     
     
    public class ExecutionRequete extends AbstractAction {
    	private GestionSQLFenetre fenetre;
    	private CreationEtudiant createEtudiant;
     
        public ExecutionRequete(GestionSQLFenetre fenetre, String texte) {
        	super(texte);
     
    		this.fenetre = fenetre;
        }
        public ExecutionRequete(CreationEtudiant createEtudiant, String texte){
        	super(texte);
     
        	this.createEtudiant = createEtudiant;
        }
     
        public void actionPerformed(ActionEvent e) { 
     
    		//Action lors du clic sur le bouton1
     
    		String gestion = fenetre.getModelGestion().getSelectedGestion();
    		String gestion2 = fenetre.getModelGestion2().getSelectedGestion2();
     
    		if (("Ajouter".equals(gestion2))&&("Gestion Etudiant".equals(gestion))){
    			createEtudiant.CreationEtudiant();
    		}
        }
     
    }
    Il ne sait pas ce que c'est createEtudiant donc je ne comprend pas du tout pourquoi il ne m'execute pas la 2eme et c'est la que le problème ce pose.

    EDIT :

    En fait le gros problème c'est que je dois faire 3 liens :

    De GestionSQLFenetre vers ExecutionRequete pour lancer ExecutionRequete
    De ExecutionRequete vers CreationEtudiant pour lancer CreationEtudiant
    De CreationEtudiant vers GestionSQLFenetre pour récupéré les donner des champ texte.

    Je sais c'est bien compliqué est beaucoup doivent penser que c'est du charabia xD

    Mais j'ai vraiment besoin de votre aide !

Discussions similaires

  1. Lancer un programme externe
    Par jagwar dans le forum Smalltalk
    Réponses: 2
    Dernier message: 30/01/2011, 21h32
  2. [Objective-C] Lancer un programme externe + question sur va_list
    Par ThomasAU dans le forum Objective-C
    Réponses: 4
    Dernier message: 10/07/2010, 14h42
  3. [Système] Lancer un programme externe
    Par Invité dans le forum Langage
    Réponses: 2
    Dernier message: 19/08/2007, 07h56
  4. [Système] Lancer un programme externe depuis une page web
    Par needles94000 dans le forum Langage
    Réponses: 2
    Dernier message: 08/02/2006, 21h34
  5. lancer un programme externe et continuer
    Par seal3 dans le forum C++
    Réponses: 6
    Dernier message: 31/10/2005, 19h00

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