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

Composants Java Discussion :

[JTextField] Rediriger l'entrée standard vers le composant


Sujet :

Composants Java

  1. #1
    Membre régulier
    Homme Profil pro
    Ingénieur avant-vente
    Inscrit en
    Décembre 2006
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur avant-vente
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2006
    Messages : 59
    Points : 116
    Points
    116
    Par défaut [JTextField] Rediriger l'entrée standard vers le composant
    Bonjour, et je vous remercie d'avance pour vos réponses.
    J'ai cherché activement mais je n'ai pas trouvé de réponses concluantes...
    Tout est dans le sujet de mon post.

    Je dispose d'un code existant qui s'execute dans un shell.
    J'ai crée une IHM qui doit reprendre le principe de fct d'un terminal, j'ai reussi à rediriger la sortie standard du script cad, les sysout du script s'affichent dans une JTextArea, je souhaiterais donc effectuer la meme operation coté entrée : taper au clavier dans une JTextField puis le transmettre au bufferedReader du script.
    C'est p-e pas la meilleure solution mais ca me permet de modifier au minimun le code existant.

    Si vous avez des solutions, des pistes de reflexion...

    Merci !

  2. #2
    Membre émérite
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Points : 2 582
    Points
    2 582
    Par défaut
    Je pense qu'il faut te faire une classe InputStream perso qui, à réception de caractères, les renvoie sur le read.

    Puis, je présume que tu peux attendre l'appui sur Entrée ? À ce moment tu chopes le contenu sur l'évènement correspondant, et tu envoies le tout sur ton InputStream.

    Sans oublier, bien sûr, de désigner cet InputStream comme entrée standard.

    Par contre, si tu veux conserver les finesses du shell, c'est beaucoup plus compliqué ; il faut à minima travailler caractère par caractère, et simuler le fonctionnement des consoles style VT100... Tu n'as vraiment rien trouvé qui fasse ça sur le web ?

  3. #3
    Membre régulier
    Homme Profil pro
    Ingénieur avant-vente
    Inscrit en
    Décembre 2006
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur avant-vente
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2006
    Messages : 59
    Points : 116
    Points
    116
    Par défaut
    Effectivement, j'ai crée une classe JTextFieldInputStream qui hérite de inputStream dont voici le code (je precise que je valide la commande en cliquant sur un JButton):

    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
    import java.io.IOException;
    import java.io.InputStream;
    import javax.swing.JTextField;
     
     
    public class JTextFieldInputStream extends InputStream {
        private JTextField textControl = null;
        private MonIHM monIHM = null;
     
        public JTextFieldInputStream( JTextField control, MonIHM monIHM ) {
            this.textControl = control;
            this.monIHM = monIHM;
        }
     
        public int read() throws IOException {  
            while( !monIHM.isOKPressed()){};
            monIHM.setOKPressed(false);
            return read((textControl.getText()).getBytes());
        }
    }
    Ce code est instancié dans l'IHM de cette facon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    jTextFieldInput = new JTextField();
                jTextFieldInput.setLocation(new Point(9, 270));
                jTextFieldInput.setSize(new Dimension(550, 20));
                InputStream in = new JTextFieldInputStream(jTextFieldInput, this);
                System.setIn(in);
    Et, pour finir voici, le code du programme s'executant en ligne de commande qu'il faut "catcher" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    do {
                System.out.println("\n==>  Quel est le numéro de téléphone du membre ?");
                BufferedReader entree = new BufferedReader(new InputStreamReader(System.in));
                dataNum = entree.readLine().toString();
     
                if(!dataNum.matches("06[0-9]{8}")) {
                    System.out.println("Le numéro de téléphone doit contenir 10 chiffres et commencer par 06 ....");
                    continue;
                }
                numMSISDN = dataNum;
                undefined = false;
            } while (undefined);
    Je pense que le problème vient de la méthode read de l'inputStream... n'etant pas un expert sur les flux, je galère un peu.

    Tu n'as vraiment rien trouvé qui fasse ça sur le web ?
    J'ai bien trouvé un thread similaire sur le forum sun java, mais je ne l'ai pas trouvé très clair, je m'en suis inspiré pour développer le code précèdent mais sans succès...

  4. #4
    Membre régulier
    Homme Profil pro
    Ingénieur avant-vente
    Inscrit en
    Décembre 2006
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur avant-vente
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2006
    Messages : 59
    Points : 116
    Points
    116
    Par défaut
    J'ai bien l'impression de vous poser une colle !

  5. #5
    Membre émérite
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Points : 2 582
    Points
    2 582
    Par défaut
    C'est pas qu'on est collé, c'est que on n'est pas forcément derrière l'ordi à suivre les forums !

    (perso j'ai passé la matinée à ce qu'un dentiste me triture les dents pour m'enlever un nerf alors l'informatique...)

    Bon, bref :

    - l'affectation de System.in à ton BufferedReader se fait-elle après ou avant que tu aies calé ce System.in sur ton JTextFieldInputStream ?

    - je m'étonne de ta méthode read dans le JTextFieldInputStream, et notamment de return read((textControl.getText()).getBytes()). Pourquoi ça ? Qu'espères-tu que cela fasse ?

    - enfin, est-ce que tout ce bastringue sert vraiment à quelque chose ? Pourquoi n'affectes-tu pas numMSISDN directement dans le listener du JTextField...

  6. #6
    Membre régulier
    Homme Profil pro
    Ingénieur avant-vente
    Inscrit en
    Décembre 2006
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur avant-vente
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2006
    Messages : 59
    Points : 116
    Points
    116
    Par défaut
    Ouille, je comprend, ca fait mal de se faire dévitaliser une dent...

    - l'affectation de System.in à ton BufferedReader se fait-elle après ou avant que tu aies calé ce System.in sur ton JTextFieldInputStream ?
    L'affectation se fait après

    - je m'étonne de ta méthode read dans le JTextFieldInputStream, et notamment de return read((textControl.getText()).getBytes()). Pourquoi ça ? Qu'espères-tu que cela fasse ?
    Oui c'est vrai, c'est la que ca cloche... c'est pas la que je dois définir ce que je veux comme nouvelle entrée? en fait j'ai lu les APIs mais j'ai pas très bien compris cette méthode read. Je ne sais pas si elle doit renvoyer caractères par caractères ou tout le contenu le la chaine depuis jTextField. De plus si je en me trompe pas, elle tourne en boucle..?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    - enfin, est-ce que tout ce bastringue sert vraiment à quelque chose ? Pourquoi n'affectes-tu pas numMSISDN directement dans le listener du JTextField...
    C'est sur que ca serait plus simple, mais le pbm est que le programme existant ne contient pas qu'un seul argument... il y'en a beaucoup... et je voudrais, si bien sur c'est possible, toucher le moins à la classe de base.

    Merci pour tes réponses

  7. #7
    Membre régulier
    Homme Profil pro
    Ingénieur avant-vente
    Inscrit en
    Décembre 2006
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur avant-vente
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2006
    Messages : 59
    Points : 116
    Points
    116
    Par défaut
    C'est bon j'ai trouvé la solution,
    dans l'action performed du bouton OK je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public void buttonOKPressed() {
            String textToSend="";
            textToSend = maTribusIHM.getJTextFieldInput().getText();
            try {
                this.in = new ByteArrayInputStream(textToSend.getBytes("UTF-8"));
                System.setIn(in);
                maTribusIHM.setCanReceive(true);
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
     
     
        }
    et ca correspond tres bien à mon pbm, Merci pour vos réponses ! ;-)

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

Discussions similaires

  1. Rediriger la sortie standard/erreur vers une chaîne
    Par LaVaZza dans le forum Débuter
    Réponses: 2
    Dernier message: 11/07/2009, 16h58
  2. Rediriger entrée micro vers sortie audio
    Par Viggen0020 dans le forum Windows Vista
    Réponses: 1
    Dernier message: 28/05/2009, 10h53
  3. [JTextField] entrée standard dans un JTextField
    Par atmakefka dans le forum Composants
    Réponses: 8
    Dernier message: 27/10/2008, 11h37
  4. Rediriger une sortie standard vers le presse-papier du bureau
    Par Schmorgluck dans le forum Applications et environnements graphiques
    Réponses: 5
    Dernier message: 13/04/2007, 23h15
  5. rediriger la sortie standard vers un textarea
    Par gromite dans le forum Composants
    Réponses: 9
    Dernier message: 10/05/2004, 11h07

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