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

 Java Discussion :

Créer une interface JAVA pour un programme non JAVA


Sujet :

Java

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Septembre 2008
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Créer une interface JAVA pour un programme non JAVA
    Bonjour,

    J'ai actuellement un projet où je dois écrire une interface graphique en java pour un programme qui, lui, n'est pas en java.
    Plus précisément, je dois exécuter un programme (maude.exe) puis donner à ce programme les lignes de commandes (tout ça en passant par mon interface JAVA).
    Pour le moment, je lance maude.exe avec le code ci-dessous.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    blablabla ... 
    String command = "C:\\Program Files\\MaudeFW\\maude.exe";
    try
        {
         Runtime r = Runtime.getRuntime();
         Process p = r.exec(command);
         }
    catch(Exception e1)
         {
          System.out.println("erreur d'execution " + command + e1.toString());
          }
    Problème 1 : Bien que Maude se lance ( on voit au niveau des processus que le processus de maude est bien lancé) aucune fenêtre ne s'ouvre. Le même code avec notepad ouvre notepad... Le problème vient peut être du fait que Maude se lance dans le panneau "invite de commandes" de windows quand on utilise les invites de commandes pour l'ouvrir...

    Problème 2 : Comment exécuter des instructions dans Maude?

    Je vous remercie d'avance pour vos réponses,
    Flore

  2. #2
    Membre expérimenté
    Avatar de yotta
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Septembre 2006
    Messages
    1 088
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 088
    Points : 1 540
    Points
    1 540
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    String command = "command /C \"C:\\Program Files\\MaudeFW\\maude.exe\"";
    try
        {
         Runtime r = Runtime.getRuntime();
         Process p = r.exec(command);
         }
    catch(Exception e1)
         {
          System.out.println("erreur d'execution " + command + e1.toString());
          }
    En fait, on lance une instance de command (sous windows, la console DOS), et le paramètre /C permet de lui demander d'exécuter une commande ou un programme définit entre guillemets avec son chemin complet. Donc, au lieu d'essayer de lancer directement maude.exe, c'est la console DOS que vous instanciez qui lancera maude.exe, donc comme si vous tapiez maude.exe dans une console DOS.
    Je penses que ça devrait fonctionner...

  3. #3
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 867
    Points : 22 929
    Points
    22 929
    Billets dans le blog
    53
    Par défaut
    Il faut de plus penser a consommer les flux de sortie et d'erreur standard du Process.

  4. #4
    Expert éminent sénior Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 627
    Points : 15 788
    Points
    15 788
    Par défaut
    En fait, on lance une instance de command (sous windows, la console DOS), et le paramètre /C permet de lui demander d'exécuter une commande ou un programme définit entre guillemets avec son chemin complet. Donc, au lieu d'essayer de lancer directement maude.exe, c'est la console DOS que vous instanciez qui lancera maude.exe, donc comme si vous tapiez maude.exe dans une console DOS.
    Je penses que ça devrait fonctionner...
    En effet le problème vient bien du fait que ton exe est en mode texte. Quand tu lance une telle application via Java, les résultats sont retourné dans les flux de sortie/erreur de l'objet Proccess retourné. Si ces flux ne sont pas lus par ton programme JAVA, l'executable sera bloqué jusqu'à ce que se soit le cas.

    Tu as donc 3 solutions possibles:
    - Démarer la console et d'executer le programme dedans comme l'explique pursang.
    - Faire que ton programme lise les flux standard/erreur pour permettre a l'exe de se dérouler normalement. Tu peux donc ainsi récupérer dans ton programme JAVA les résultats affiché par l'executable.
    - Tout simplement fermer les flux standard/erreur, si les résultats ne tintéressent pas

  5. #5
    Nouveau Candidat au Club
    Inscrit en
    Septembre 2008
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Bonjour,
    Merci pour vos réponses. Comme je ne suis pas très familière avec les histoires de streams ... J'ai essayé de suivre vos indications. Mais pour le moment rien ne se passe.

    voici le code que j'ai essayé pour lancer la fenêtre de commande puis maude dedans... cmd et maude se lancent bien mais je n'ai toujours rien d'affiché à l'écran. (Cependant si je pouvais communiquer avec Maude ce ne serait pas grave puisque je veux que maude n'apparaisse pas du tout pour mon utilisateur...)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    String[] command ={"cmd.exe","/C","C:\\Program Files\\MaudeFw\\maude.exe"};
              try
                  { 
                     Runtime r = Runtime.getRuntime();
    	         Process p = r.exec(command);
    		 new Thread_inputStream(p.getErrorStream()).start();
    		 new Thread_inputStream(p.getInputStream()).start();	    
    		}			     
               catch(Exception e1)
    		{
    	         System.out.println("erreur d'execution " + command + e1.toString());
    	         }
    avec
    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
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
     
     
    public class Thread_inputStream extends Thread{
    	private InputStream inputStream;
     
    	public Thread_inputStream(InputStream s){
    		super();
    		InputStream inputStream=s;	
    	}
     
    	public void run(){
        	try{
    	        BufferedReader reader=new BufferedReader (new InputStreamReader(inputStream));
        		String line="";
        		try{
        			while((line=reader.readLine())!=null){
        				System.out.println(line);
        			}
        		}
        		finally {
        			reader.close();
        		}
        	}
        	catch(IOException ioe){
        			System.out.println(ioe);
        	}
        	catch (NullPointerException npe){
        		System.out.println(npe);
        	}
     
    	}
    }
    En fait quand je lance ce code j'obtiens toujours des nullPointerException pour inputStream, outputStream et errorStream. (et ce quel que soit le programme que j'essaie de lancer. Pour notepad par exemple, notepad se lance mais j'ai toujours le nullPointerException...) Qu'est ce que ça veut dire? Comment est ce que je peux envoyer/recevoir des informations de maude de mon application java? J'ai lu des choses sur des pipes mais j'ai pas vraiment compris ce que ça faisait...
    Merci d'avance

  6. #6
    Expert éminent sénior Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 627
    Points : 15 788
    Points
    15 788
    Par défaut
    Pour lire le stream, tu t'y prend bien sauf que il y a une petite erreur ici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    	private InputStream inputStream;
    
    	public Thread_inputStream(InputStream s){
    		super();
    		InputStream inputStream=s;	
    	}
    Tu déclares une variable locale qui masque le inputStream de la classe. Du coup, le inputStream de la classe reste null et provoquer une exception lors de son l'utilisation.


    Sinon passer par "cmd.exe /c" n'est pas utile si tu executes directement un fichier exe.
    Il est nécessaire seulement si tu dois executer un fichier ".bat" ou une fonctionalité propre au shell comme: "dir", "net start ...", "program > fichier", "ls | grep pattern", ...

  7. #7
    Membre expérimenté
    Avatar de yotta
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Septembre 2006
    Messages
    1 088
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 088
    Points : 1 540
    Points
    1 540
    Par défaut
    Je penses qu'il y a une erreur concernant la construction de votre instruction sous forme de String[], essayez plutôt ça :
    String command ="cmd.exe /C \"C:\\Program Files\\MaudeFw\\maude.exe\"";
    Personnellement, je n'ai jamais réussi à exploiter les surcharges de la méthode execute de l'objet RunTime...
    Quand à la récupération du flux, c'est juste, et ce que dit Uther est vrai, il suffit de supprimer le paramèter de votre constructeur, et d'éliminer la ligne InputStream inputStream=s;

  8. #8
    Expert éminent sénior Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 627
    Points : 15 788
    Points
    15 788
    Par défaut
    Si c'est le programme est démarré directement sans "cmd /c", les guillemets échapés ne seront pas nécéssaires:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String command ="C:\\Program Files\\MaudeFw\\maude.exe"
    est suffisant et évitera d'avoir un programme supplémentaire démarré (même si cmd n'est pas bien lourd).

  9. #9
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par pursang Voir le message
    Je penses qu'il y a une erreur concernant la construction de votre instruction sous forme de String[], essayez plutôt ça :
    String command ="cmd.exe /C \"C:\\Program Files\\MaudeFw\\maude.exe\"";
    Personnellement, je n'ai jamais réussi à exploiter les surcharges de la méthode execute de l'objet RunTime...
    Au contraire il est préférable de bien séparer tous les paramètres dans un tableau, sinon on pourrait avoir un découpage inattendu...


    Plus d'info :


    a++

Discussions similaires

  1. Réponses: 9
    Dernier message: 14/10/2014, 17h07
  2. Réponses: 7
    Dernier message: 01/02/2013, 09h09
  3. [AC-2007] Créer une interface utilisateur pour modifier des couleurs
    Par Triton972 dans le forum IHM
    Réponses: 6
    Dernier message: 18/08/2011, 21h36
  4. Quelle GUI pour un programme local java pour windows (type .exe) ?
    Par Faiche dans le forum Interfaces Graphiques en Java
    Réponses: 3
    Dernier message: 10/11/2009, 17h55
  5. [AJAX] Créer une interface web pour un programme Java
    Par Wookai dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 30/03/2006, 11h10

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