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

Interfaces Graphiques en Java Discussion :

Lancer un .exe depuis un JButton et afficher le resultat


Sujet :

Interfaces Graphiques en Java

  1. #1
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2013
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Lancer un .exe depuis un JButton et afficher le resultat
    Salut a tous!
    Comme dans le titre dans la méthode ActionPerformed d'un JButton je veux qu il lance un .exe censé de faire un traitement d'image et créer donc une image qui reste sauvegardée sur le desktop, et puis l'afficher. si je clique sur l'exe l'image apparait sur mon bureau.. donc il marche. si je le lance depuis l'interface graphique il me donne un erreur, et je crois car après avoir lancé .exe (comme process) il passe a la ligne suivante ou il dit d'afficher une image depuis un lien qui adresse encore a rien si l'exe n'a pas fini! donc j'ai pensé..... il faut utiliser les THREADS

    voici une classe photo
    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
    class Photo extends Thread
    {public synchronized void Crea(Boolean existe)throws InterruptedException
        {if (existe==false) { System.out.println("on cree la photo");
                                existe = true;
                                notifyAll();}
        else {System.out.println("la photo existe");}
        }
    public synchronized void Affiche(Boolean existe) throws InterruptedException
        {if(existe==true){ System.out.println("on affiche la photo");
                         }
            else { System.out.println("je ne peux pas afficher la photo");
                    wait();
                  }
        }
    private Boolean existe=false;
    }
     
    et puis j'ai cree la classe Creer (dont le filepath c'est le filepath de l'.exe)
    class Crea extends Thread
    { public Crea (Photo p, String filePath)
        {this.p=p; this.filePath=filePath;}
    @Override
      public void run()
        {try
            {while(!interrupted())
                {Process p = Runtime.getRuntime().exec(filePath);}
            }
        catch (IOException ex) {
            Logger.getLogger(Crea.class.getName()).log(Level.SEVERE, null, ex);
        }
        }
        private Photo p;
        private String filePath;
    }
    et Affiche (dont le filepath c est l'image creé par l'.exe)
    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
    class Affiche extends Thread
    {
    public Affiche (Photo p,String filePath)
        {this.p=p; this.filePath=filePath;
        }
    @Override
     public void run()
        {try
            {while(!interrupted())
                {this.result=ImageIO.read(new File(filePath));}
            }
        catch (IOException ex) {
            Logger.getLogger(Affiche.class.getName()).log(Level.SEVERE, null, ex);
        }
     
        }
        private Photo p;
        private String filePath;
        BufferedImage result;
    }
    et voici finalement l'actionperformed de mon JButton (qui est dans la classe qui extends le JFrame):
    private void getoldActionPerformed(java.awt.event.ActionEvent evt) {                                      
                String filePath1 = "C:\\Users\\...\\Desktop\\....exe";
                String filePath2 = "C:\\Users\\...\\Desktop\\result.png";
     
            try {
     
                Photo p = new Photo();
    Crea cp= new Crea (p,filePath1);
    cp.start();
    Affiche ap= new Affiche (p,filePath2);
    ap.start();
    this.result = ap.result;
     
            } catch (Exception e) {
            }
     
            double reduction=270./(this.width);
     
               resultlb.setBounds(900, 10, photoaging2.scale(this.result,reduction).getWidth(null), this.scale(this.result,reduction).getHeight(null));
               resultlb.setIcon(new ImageIcon(photoaging2.scale(this.result,reduction)));
     
     
        }
    Je sais que ça fait beaucoup de code, mais je savais pas comme poser la question autrement.. je ne vois pas ou mon traitement de la synchronisation "creer et affiche" bugge ... peut être que en graphique les threads son traités différemment?? merci pour tout sorte de conseil!!
    bisous

    ps.scale c'est une méthode définie par moi qui marche pour afficher une image redimensionnée correctement!

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Tu te casse la tête pour rien. Content toi d'attendre que le process (exe) aie fini. Pour cela, il suffit d'appeler la méthode waitFor() sur l'instance de Process.

  3. #3
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2013
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Tu te casse la tête pour rien. Content toi d'attendre que le process (exe) aie fini. Pour cela, il suffit d'appeler la méthode waitFor() sur l'instance de Process.
    j'ai essayé !
    j'ai creé cette classe


    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
    public class LanceAppExt {
        @SuppressWarnings("empty-statement")
        public static void lance(String filePath) throws IOException {
            try {
               Process p = Runtime.getRuntime().exec(filePath);
     
              p.waitFor();
     
               //Attendre la fin de l'execution del'exe
                if (p.waitFor() != 0) {
                    System.out.println("Une erreur est survenue ");
                }
                if(p.exitValue()==0) {
     
                    System.out.println("image cree ");
                }
            } catch (InterruptedException | IOException ex) {
                Logger.getLogger(LanceAppExt.class.getName()).log(Level.SEVERE, null, ex);
            }
    }
    }
    et apres dans la classe qui extends le JFrame dans l'actionerformed du bouton je l'appelle LanceAppExt.lance(filePath_app)

    et dans l'interface graphique ça ne se passe rien, dans la console apres qq instant il m'ecrit image cree... du coup ça veut dire que le program s'est executé et il a renvoyé 0 a la methode en disant j'ai fini! j'ai essayé soit avec waitFor et avec exitValue.. le programme se lance et il renvoie zero alors qu il fait rien! est-ce que je dois essayer avec processbuilder? il y a qui dit que il y a plus de chance que l'app externe faisse son boulot.. il y a qui dit que ça ne change rien; apparemment c'est repandu ce probleme de l'appel a un exe externe

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Si le programme ne fait rien, je suppose que tu ne lui pas passé les bons paramètres, ca n'a rien à voir avec le fait d'attendre qu'il aie fini ça.

    LA valeur de retour dépend de la "qualité" du programme en question, il faut que celui qui l'a codé aie bien géré les valeur de retour. Sinon, ce sera 0 même en cas d'erreur....

  5. #5
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Oui, il faut appeler l’exécution du processus dans un Thread externe comme c’était fait dans le 1er post. Si on le fait directement dans l'actionPerformed(), on bloque bien sur l'EDT et la GUI.

    Ensuite, petite piquouse de rappel : il faut consommer les flux de sortie (process.getOutputStream()) et d'erreur du programme (process.getErrorStream()) ! Et si possible dans des threads séparés (il faudra donc faire un join() dessus après le waitFor()).

    => Invoking Processes from Java

    => Pourquoi est-ce que mon application se bloque à l’exécution d'un programme externe ?

    Si certaines commandes fonctionnent bien en ligne de commande mais ne s’exécutent pas correctement avec Runtime.exec, essayer de les construire avec ProcessBuilder a la place.
    De plus, des changements (dus aux renforcements de la sécurité ?) dans les 3 dernières sous-versions de la JVM m'ont régulièrement demandé d'aller retoucher le code qui lançait les processus de manière a spécifier différemment les arguments ou les " du chemin de l'exec sur des taches que j'avais créées (pour appeler jarsigner.exe sur des fichiers)
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

Discussions similaires

  1. Lancer un .exe depuis code c++
    Par L4rS-WooL dans le forum C++/CLI
    Réponses: 10
    Dernier message: 12/04/2013, 22h46
  2. Réponses: 1
    Dernier message: 12/02/2008, 17h14
  3. lancer un .exe depuis une macro
    Par 20100. dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 04/02/2008, 10h42
  4. Lancer un exe depuis une appli
    Par Kristian22 dans le forum Delphi
    Réponses: 3
    Dernier message: 08/12/2006, 12h43
  5. Lancer un exe depuis une barre d'outils office
    Par murphy99 dans le forum Autres Logiciels
    Réponses: 1
    Dernier message: 10/01/2006, 10h38

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