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

Langage Java Discussion :

Sortie console vers GUI


Sujet :

Langage Java

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    287
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 287
    Par défaut Sortie console vers GUI
    Bonjour à tous,

    Je souhaiterai récuperer les flux de sortie et d'erreur de la console afin de les afficher dans une interface.
    Etant donné que cette sortie doit aussi se faire dans un fichier texte, j'ai récupéré la class créé par AdiGuba dans ce topic. J'aimerais donc savoir s'il serait possible d'ajouter un JtextArea à cette sortie de flux, et si oui, comment le faire .

    Merci beaucoup.

  2. #2
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Oui, c'est possible.
    Tu peux créer un objet qui est un OutputStream, et qui contient un JTextArea. L'objet sera à ajouter à la liste des flux gérés par le multi-outputstream.
    Exemple de squelette :
    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
    public class TextAreaOutputStream implements OutputStream
    {
      private JTextArea area;
     
      public TextAreaOutputStream( JTextArea area )
      {
        this.area = area;
      }
     
      @Override
      public void close() throws IOException {}
      @Override
      public void flush() throws IOException {}
     
      @Override
      public void write(byte[] b, int off, int len) throws IOException
      {
        area.append( new String( b, off, len ) );
      }
     
      @Override
      public void write(byte[] b) throws IOException
      {
        area.append( new String( b );
      }
     
      @Override
      public void write(int b) throws IOException
      {
        area.append( (char)b );
      }
    }
    Il reste bien sûr à :
    1. traiter l'encodage du flux (ça peut être un paramètre du constructeur)
    2. ajouter un booléen pour savoir si on ajoute automatiquement un retour à la ligne à chaque append
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    287
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 287
    Par défaut
    Bonjour,

    Merci pour ta réponse, jour férié oblige je ne l'ai vu qu'aujourd'hui .

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    287
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 287
    Par défaut
    Rebonjour

    Petit soucis, l'affichage ne se fait pas en même temps, il ne se fait qu'une fois le traitement terminé.

    Ue petite idée de comment corriger cela?

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Par défaut
    Plutôt que d'utiliser un OutputStream, utilise un PrintStream tout en le modifiant pour flusher après chaque println();

    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
    public class TextAreaOutputStream extends java.io.PrintStream {
      private final JTextArea area;
     
      public TextAreaOutputStream (JTextArea area) {
        if (area == null) throw new NullPointerException("area is null");
        this.area = area;
      }
     
      @Override
      public void println() {
        super.println();
        flush();
      }
     
      @Override
      public void write(byte[] b, int off, int len) throws IOException
      {
        area.append( new String( b, off, len ) );
      }
     
      @Override
      public void write(byte[] b) throws IOException
      {
        area.append( new String( b );
      }
     
      @Override
      public void write(int b) throws IOException
      {
        area.append( (char)b );
      }
     
    }

  6. #6
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Citation Envoyé par Micke7 Voir le message
    Rebonjour

    Petit soucis, l'affichage ne se fait pas en même temps, il ne se fait qu'une fois le traitement terminé.

    Ue petite idée de comment corriger cela?
    Tu fais ton traitement directement dans un listener d'un composant graphique ?
    Il faut faire le traitement dans un Thread séparé.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    287
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 287
    Par défaut
    Les Thread je n'ai pas encore vraiment utilisé, donc je vais tester l'autre soluce (mais promis je m'y met bientôt )

    dingoth, j'ai testé ton code mais 2 erreurs persistent :
    la première sur le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public TextAreaOutputStream(JTextArea area)
    avec comme erreur : Implicit super constructor PrintStream() is undefined. Must explicitly invoke another constructor

    et la seconde sur le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    area.append( (char)b );
    (dernier append) avec cette foispour erreur : The method append(String) in the type JTextArea is not applicable for the arguments (char).

    Une idée?


    [EDIT]D'ailleurs, autre petit soucis, tout ce qui concerne les erreurs(types exceptions) n'est pas loggué, affiché. Assez embétant...

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    287
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 287
    Par défaut
    Toujours pas de solutions?

  9. #9
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Micke7 Voir le message
    Toujours pas de solutions?
    La solution a été donné : c'est une gestion correct des threads pour ne par surcharger l'EDT.

    Tu trouveras plus d'info sur le forum du même nom ou dans les tutoriels du site...

    a++

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    287
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 287
    Par défaut
    Et bien en fait je parlais de l'autre solution (utilisation du PrintStream) mais étant donné que je ne connais pas les Threads je vais opter pour cette solution, cela me fera un premier aperçu.

  11. #11
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Par défaut
    Les deux solutions ensemble te donneront tout ce dont tu as besoin.

    Mon code du PrintStream comporte sans doute des fautes, mais tu peux facilement le corriger...

    Pour le thread graphique, c'est simple :

    Dans chacune des méthodes du PrintStream, tu entoures le area.append(...) par un SwingUtilities.invokeLater(new Runnable(){public void run() {... area.XXX() ...}}):
    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
    public class TextAreaOutputStream extends java.io.PrintStream {
      private final JTextArea area;
     
      public TextAreaOutputStream (JTextArea area) {
        super(null);
        if (area == null) throw new NullPointerException("area is null");
        this.area = area;
      }
     
      @Override
      public void println() {
        super.println();
        flush();
      }
     
      @Override
      public void write(final byte[] b, final int off, final int len) throws IOException
      {
        SwingUtilities.invokeLater(new Runnable() {public void run () {
          area.append( new String( b, off, len ) );
        }});
      }
     
      @Override
      public void write(final byte[] b) throws IOException
      {
        SwingUtilities.invokeLater(new Runnable() {public void run () {
          area.append( new String( b ) );
        }});
      }
     
      @Override
      public void write(final int b) throws IOException
      {
        SwingUtilities.invokeLater(new Runnable() {public void run () {
          area.append( Char.toString((char)b) ) );
        }});
      }
     
    }
    Il faut bien sûr déclarer chacun des paramètres à utiliser dans le SwingUtilities comme final.

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    287
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 287
    Par défaut
    Gloubgloubgloub (en train de couler...)

    Mes connaissances sont bien en déca de ça! Du moins au premier coup d'oeil je n'ai strictement rien compris

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    287
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 287
    Par défaut
    Bon alors pour mon apprentissage sur l'utilisation des Threads, j'ai utilisé mon programme actuel comme test (création de thread à droite et à gauche) et en créant un thread qui englobe (désolé si les termes ne sont pas appropriés) le traitement effectué lors du clique sur le bouton valider, l'affichage console sur mon JTextArea se fait comme je le souhaitais (en même que les différents traitements et non une fois tous les traitements terminés) .
    Heureux que ça fonctionne mais j'aimerais bien savoir pourquoi ?
    Donc si quelqu'un a 5 min. à perdre...

    De plus, dernière question, l'ascenseur du JtextAreas ne descend pas en même temps que l'apparition du texte, il reste toujours dans a position haute. Quelqu'un serait-il comment remedier à cela (bon j'avoue ne pas encore avoir regardé).

    Merci pour tout

  14. #14
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Citation Envoyé par Micke7 Voir le message
    De plus, dernière question, l'ascenseur du JtextAreas ne descend pas en même temps que l'apparition du texte, il reste toujours dans a position haute. Quelqu'un serait-il comment remedier à cela (bon j'avoue ne pas encore avoir regardé).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    area.setCaretPosition( area.getDocument().getLength() );
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  15. #15
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    287
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 287
    Par défaut
    Désolé j'ai oublié de passer le topic sur résolu, j'avais trouvé la réponse.

    Merci à tous pour votre aide.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 27/06/2012, 14h49
  2. [Batch] Rediriger sortie console vers fichier malgré plusieurs call?
    Par takinelinfo dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 01/12/2011, 18h02
  3. Réponses: 2
    Dernier message: 13/11/2009, 18h02
  4. Redirection sortie JBoss vers console
    Par Mister Nono dans le forum Wildfly/JBoss
    Réponses: 4
    Dernier message: 23/12/2008, 19h37
  5. Réponses: 2
    Dernier message: 30/10/2007, 18h41

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